2016-05-19 5 views
0

У меня есть таблица с полем CustomerName. У меня есть запись, где CustomerName является «CustomerABC» мой запрос на выборку выглядит следующим образом:Foxpro SELECT запрос can not find item is is is true

SELECT fieldA, fieldB, fieldC 
from CustomersTable 
WHERE CustomerName='CustomerABC' 

Это возвращает запись, но если дело не так, это ничего не возвращает. например

SELECT fieldA, fieldB, fieldC 
from CustomersTable 
WHERE CustomerName='customerabc' 

не дал результатов.

Несомненно, пользователи не должны знать правильный случай записи, которую они ищут !? Может ли кто-нибудь помочь мне с этим, пожалуйста?

Благодаря Джона

+0

Просто понял, что если я заставляю строку отправки должны быть преобразованы в верхний регистр, то я могу использовать это .. WHERE UPPER (CustomerName) =» CUSTOMERABC ' – user2463687

+0

кажется затянутым только для этой простой работы - это нормально для foxpro? – user2463687

+0

Да, это нормально для VFP. Данные чувствительны к регистру, поэтому, если вы хотите сделать поиск без учета регистра, вам нужно его закодировать. –

ответ

1

По умолчанию FoxPro в = и == операторов чувствительны к регистру, так это будет влиять на запросы. Однако команда SET COLLATE TO "GENERAL" может использоваться для изменения поведения и позволяет совместить символы верхнего и нижнего регистра в операциях сравнения.

Если вы хотите использовать случай по умолчанию и игнорировать, используйте функции UPPER() или LOWER() для преобразования строк для сравнения. Если запрос будет выполнен в коде (по сравнению с специальным запросом в окне команд), обычно рекомендуется применять функции к обеим сторонам сравнения, если вы точно не знаете, что данные в таблице отформатированы определенным образом путь.

SELECT fieldA, fieldB, fieldC 
from CustomersTable 
WHERE UPPER(CustomerName)=UPPER('customerabc') 

Кроме того, при использовании сравнения строк, рассмотрит влияние настроек SET EXACT и SET ANSI, как они контролируют поведение для ватных строк и строк разной длины.

+0

Важно отметить, что использование COLLATE, установленное в «GENERAL», имеет некоторые последствия. Во-первых, это означает, что индексный ключ может составлять всего 120 символов, а не 240. Во-вторых, вы можете потерять оптимизацию Rushmore с помощью последовательностей сортировки, отличных от «MACHINE». В целом для этой цели лучше использовать UPPER(). –

0

Я иногда использую ...

ALLTRIM(UPPER(CustomerName)) == UPPER('customerabc') 

... ИЛИ если я пытаюсь сопоставить переменную или другое поле я буду использовать ...

ALLTRIM(UPPER(CustomerName)) == ALLTRIM(UPPER(SomeOtherField)) 

... просто конечно, я получаю свои точные совпадения.

+0

Имейте в виду, что упаковка с ALLTRIM() может мешать оптимизации.Rushmore работает только тогда, когда одна сторона сравнения точно совпадает с существующим тегом индекса. –

+0

Хорошая точка. Не используйте на больших наборах данных. – JustAspMe

0

Благодарим вас за ответы, так как кажется, что я выбрал разумный вариант. В выборе UPPER (и мои запросы все еще очень быстрые) я думаю, что я буду придерживаться этого). Рад, что это было подтверждено, что это как FoxPro работает

Еще раз спасибо Джон

+0

Как работает большинство баз данных. –