1

我有一个包含 5 列的表 - col1、co12、...我有 5 个搜索参数在每列上进行搜索。我需要编写一个 mySQL 查询,它将返回所有匹配的结果。如果我没有为搜索参数提供值,它将被忽略。

我有这个,但它不起作用

select * from tableA
where ((col1 IS NULL AND srch1 IS NULL) OR (col1 like srch1))
and ((col2 IS NULL AND srch2 IS NULL) OR (col2 like srch2))
etc...
4

3 回答 3

0
Select * from tableA where
col1 like '%' + Coalesce(srch1,col1) + '%' and
col2 like '%' + Coalesce(srch2,col2) + '%'
于 2012-11-14T23:14:57.173 回答
0

我认为“不起作用”是指您的like部分条件不起作用。

那是因为您必须用%字符包装搜索字符串以形成“喜欢”搜索词。尝试这个:

select * from tableA
where ((col1 IS NULL AND srch1 IS NULL) OR col1 like concat('%', srch1, '%'))
and ((col2 IS NULL AND srch2 IS NULL) OR col2 like concat('%', srch2, '%'))
etc...


你非常接近!

于 2012-11-14T23:28:07.160 回答
0

通过在括号中将每个条件与自身进行 OR'd,并首先测试 null,这将预先限定条件并忽略另一半。如果有一个值,则针对相应的列进行测试。现在,也就是说,如果您真的需要“LIKE”限定符,那么您可能需要期待或添加“%”以进行通配符匹配。

select
      A.* 
   from 
      tableA  A
   where 
          (srch1 is null OR col1 like srch1)
      AND (srch2 is null OR col2 like srch2)
      AND (srch3 is null OR col3 like srch3)
      AND (srch4 is null OR col4 like srch4)
      AND (srch5 is null OR col5 like srch5)

因此,如果您只提供 srch3 参数,那么答案将解释为

where 
       TRUE
   and TRUE
   and col3 like srch3
   and TRUE
   and TRUE

自从srch?is null 首先为真,然后忽略该测试的其余部分。

于 2012-11-14T23:55:00.367 回答