2010-03-04 81 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%' 

现在,当A和a不空它的工作原理,但是当A,A和C是不是空的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 WHERE”。$ A”为空或名称LIKE '% “$ A” %' \t \t AND “。$ b。”为空或颜色LIKE'%“。$ b。”%' \t \t AND“。$ c。”为空或城市LIKE'%“。$ c。”%' ' 错误读取类似 正确的语法使用附近'是空的 – alex

+0

哦,我忘了()和'“。 – alex

+0

嗯,仍然没有按预期工作 – 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查询的子句寻找从AND/OR逻辑true/false结果。因此,您可以返回要测试的表达式,或者测试结果,或IF()函数的原始硬值true/false