VFP-запрос, как команда не работает - PullRequest
1 голос
/ 13 марта 2012
SELECT iif( LIKE(sol,'EM06%'), "other",sol) as solGroup;
    FROM dpgift GROUP BY solGroup

Выше приведен столбец, содержащий уникальные значения sol.Кроме того, любое значение sol, начинающееся с EM06, должно быть сгруппировано в «other».Это не работает, но вместо этого возвращает следующее.

Solgroup
DM081
EM061
EM081
EM100
EM101
EM105
EM111
TM081

Кто-нибудь может увидеть, что я делаю здесь неправильно?2-я и 3-я строки должны называться «other».

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

edit: использование '*' и установка подстановочной строки в качестве первого параметра работает.Некоторое время я действительно делал эту ошибку следующим образом:

iif( (LIKE("4%",sol) OR sol = "4"),"8M","other");

like здесь ничего не делает, но я не заметил, так как оператор '=' возвращает true, если sol начинается с«4» (может кто-нибудь связать меня со ссылкой на «=» поведение?).Причина, по которой я включил sol = "4", заключается в том, что я предположил, что% означает один или несколько символов, а не 0 или более.Как бы то ни было, я вернулся и изменил весь свой код на iif(like("wtvr*",string),stringtrue,stringfalse)

Я полагаю, использование '=' для сравнения строк не рекомендуется, так как, похоже, его не упоминают в библиотеке msdn.

1 Ответ

4 голосов
/ 13 марта 2012

другой альтернативой является использование "$", AT () или ATC ()

"$" означает, что если левая сторона найдена где-либо в правой части ...

iif(«EM06» $ sol, «other», sol)

AT () для сравнения, если строка найдена в другой, но IS CASE-SENSITIVE, возвращает позицию символа, найденную в строке (VFPНа основе 1, не на основе нуля)

iif (at ("EM06", sol)> 0, "other", sol)

или

ATC ()- то же, что AT (), но НЕ чувствителен к регистру.

Если вы хотите, чтобы «EM06» был в начале строки, вы могли бы просто сделать сравнение влево ()

iif (слева (sol, 4) = "EM06", "other", sol)

или даже

iif (ATC ("EM06", sol) = 1,"other", sol)

и да, все они действительны в SQL-Select ..

...