2010-03-04 2 views
1

Я заметил мой запрос не ведет себя правильно, если одна из переменных, как пусто:Как пропустить пустой оператор LIKE в нескольких запросах LIKE?

SELECT name 
FROM employee 
WHERE name LIKE '%a%' 
AND  color LIKE '%A%' 
AND  city LIKE '%b%' 
AND  country LIKE '%B%' 
AND  sport LIKE '%c%' 
AND  hobby LIKE '%C%' 

Теперь, когда и А не опустошить он работает, но когда, А и С не опустошить гр части не исключается, так кажется?

Как это исправить?

+3

Пожалуйста, разместите запись, которая, по вашему мнению, должна совпадать, но это не так. – Quassnoi

ответ

0

Я предполагаю, что вы хотите сделать фильтр, где вы проверите только значение, если значение фильтра не равно нулю. В этом случае проверьте недействительность в переменной как альтернативное условие.

select name 
from employee 
where (@a is null or name like '%' + @a + '%') 
    and (@b is null or color like '%' + @b + '%') 
    ... 
+0

хмм, он возвращает ошибки, я использую PHP ' $ SQL = "SELECT * FROM сотрудника \t \t ГДЕ". $ А.» Равно нулю или имя LIKE '% "$ а." %' \t \t И ". $ b." имеет значение null или color LIKE '% ". $ b."%' \t \t И ". $ c." имеет значение null или city LIKE '%. $ c. "%' ' ошибка читает что-то вроде правильный синтаксис для использования рядом с 'is null – alex

+0

oh i forget() и'. – alex

+0

hmm, все еще не работает как ожидалось – alex

2

Используйте функцию IF() ....

SELECT name 
    FROM employee 
WHERE (IF(LENGTH('%a') > 0, name LIKE '%a%' , 0) 
    OR IF(LENGTH('%A') > 0, color LIKE '%A%', 0) 
    OR IF(LENGTH('%b') > 0, city LIKE '%b%' , 0) 
    OR IF(LENGTH('%B') > 0, country LIKE '%B%', 0) 
    OR IF(LENGTH('%c') > 0, sport LIKE '%c%' , 0) 
    OR IF(LENGTH('%C') > 0, hobby LIKE '%C%' , 0) 
     ) 

ИНЕКЕ запроса SQL ищет true/false результата от AND/OR логики. Таким образом, вы можете вернуть выражение, которое должно быть TESTed, или результат теста, или необработанное твердое значение true/false из функции IF().

Смежные вопросы