在where子句中使用“case”和“or”

时间:2012-12-14 15:47:00

标签: sql sql-server tsql

我想在SQL Server中执行此查询,但它不起作用:

Select Nom from tab
  WHERE 
Nom  LIKE
CASE WHEN libelle !='' then
  Nom1 
OR 
 Nom2  
else 
 Nom3
end

任何帮助都将不胜感激

更新:从OP评论中添加:

  

我想验证libelle不是像nom1那样空的nom还是像nom2 else(如果libelle是空的)nom nom nom3

4 个答案:

答案 0 :(得分:6)

我不认为case是正确的方式,所以我看到这更像是:

select Nom
from tab
where (
    libelle != ''
    and (
        Nom like Nom1
        or Nom like Nom2
    )
)
or (
    libelle = ''
    and Nom like Nom3
)

对我来说,阅读和理解似乎更简单。查询优化器甚至可能同意。

答案 1 :(得分:3)

SELECT Nom 
FROM tab
WHERE
   1 = CASE
         WHEN libelle != '' AND (Nom like Nom1 OR Nom like Nom2) THEN 1
         WHEN libelle = '' AND Nom like Nom3 THEN 1
         ELSE 0
       END

(非常类似于其他选项 - 特别是蒂姆的)

答案 2 :(得分:3)

所以你试图做动态SQL然后,我不相信你可以像使用case语句那样做,这可能会起作用:

declare @sql nvarchar(100)
declare @libelle nvarchar(20)
--Set @libelle to something (can be via a query, or a stored proc parameter etc rather than just a string like here
set @libelle = ''
set @sql = 'SELECT Nom FROM tab WHERE Nom LIKE'

IF @libelle = ''
    SET @sql = @sql + ' ''Nom3'''
ELSE
    SET @sql = @sql + ' ''Nom1'' OR Nom LIKE ''Nom2'''
EXEC (@sql)

这至少应该让你走上正确的道路。

答案 3 :(得分:1)

语法为:

   CASE WHEN libelle != '' THEN Nom1
        WHEN libelle /* OTHER CONDITION HERE */ THEN Nom2
        ELSE Nom3
   END