2015-08-05 1 views
1

У меня есть таблица пользователей с именем и фамилией. Я хочу найти пользователя для строки типа «clark kent». Я делаю этоЗапрос Firebird с конкатенацией строк и т. Д. В предложении where не работает

SELECT * FROM user WHERE fisrt_name || ' ' || last_name LIKE '%clark kent%' 

, но у меня нет никакого результата. Почему? Если я ищу «clark» или «kent», он работает.

+2

Показать us [MCVE] (http://stackoverflow.com/help/mcve), пожалуйста: CREATE TABLE, INSERT запись, затем SELECT, которая работает, и SELECT, которая этого не делает. Я предполагаю, что 'first_name' является [пространственным столбцом CHAR] (http://www.firebirdfaq.org/faq237/), поэтому вы фактически сопоставляете шаблон с построенным значением, которое выглядит примерно так:' clark [sp ] [sp] [sp] [sp] kent [sp] [sp] [sp] [sp] ' – pilcrow

+0

Вы правы! Поля - char не varchar. Теперь я очищаю поля first_name и last_name с помощью trim(). большое спасибо – user3083618

ответ

3

Решение:

SELECT * 
    FROM user 
WHERE TRIM("first_name") || ' ' || TRIM("last_name") LIKE '%clark kent%'; 

За комментариями Op, в трудность заключается в том, что first_name и last_name были CHAR, а не VARCHAR поля, а это означает, что поля пространства-проложенный к их длина. То есть строка 'clark', хранящаяся как CHAR (8), равна 'clark[sp][sp][sp]'.

При объединении полей вместе, чтобы сформировать «полное имя», тогда в результате строки были непредвиденные пробелы: 'clark[sp][sp][sp][sp]kent[sp][sp][sp][sp]'.

(Кстати, в строгом SQL, CHAR столбцы довольно нелогичным. Они сравнить без учета пространства заполнения, но LIKE оператор не игнорировать пространство заполнения. См Firebird FAQ.)

0

Попробуйте

SELECT * 
    FROM user 
WHERE upper(fisrt_name) LIKE '%CLARK%' 
    and upper(last_name) LIKE '%KENT%' 
Смежные вопросы