postgresql - Почему% не возвращает точные совпадения? - PullRequest
0 голосов
/ 17 мая 2011

Запрос:

SELECT users.* FROM "users" WHERE (lower(fname) || ' ' || lower(lname) LIKE '%jeff bat%') LIMIT 25

Не возвращает пользователя с fname: jeff и lname: bat

Но если вы запустите

SELECT users.* FROM "users" WHERE (lower(fname) || ' ' || lower(lname) LIKE '%jeff ba%') LIMIT 25

Если один символ выключен, он возвращает этого пользователя. Почему% LIKE не возвращает точные совпадения? И как я могу обновить запрос, чтобы также включить точное совпадение? Спасибо

Ответы [ 4 ]

0 голосов
/ 18 мая 2011

Моя догадка связана с диагнозом Канчирка, с изюминкой: есть ли вероятность того, что чувствительность к регистру дополнительно поднимает свою уродливую голову, и что вы должны использовать ilike в дополнение к триммеру?

0 голосов
/ 17 мая 2011

% в конце означает, что в части имени «Летучая мышь» больше символов.Таким образом, «Bats», «Batch» и «Batty» подойдут, но «Bat» не будет, потому что после «t» ничего нет.Теоретически% соответствует 0+ символам, но не похоже, что это происходит здесь.

0 голосов
/ 18 мая 2011

Очевидно, вам нужна обрезка, как сказал @kanchirk:

Это должно сработать или попробовать это так

SELECT users.* 
FROM "users" 
WHERE lower(trim(fname)) LIKE '%jeff %'  
AND lower(trim(lname)) LIKE '%bat%') 
LIMIT 25
0 голосов
/ 17 мая 2011

Точный результат вы должны получить, включив в свой запрос функцию обрезки, как показано ниже

SELECT users.* FROM "users" WHERE (trim(lower(fname)) || ' ' || trim(lower(lname)) LIKE '%jeff ba%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...