2017-06-01 34 views
1

我的要求:如果'名字'和'地址'不为空,那么就要考虑两者的价值。如果其中一个是空的,但是其他的只是给定的,那就只是“搜索”给定的。当我在where子句中出现什么情况?

SELECT * from myTable where (1=1) AND (@p_ID is null or [Id] = @p_ID) 
AND 
    case 
    when [Name] IN (SELECT keyValue FROM @p_PersonalData) 
     then 
       ((SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 
       OR ([Address] IN (SELECT dictKey FROM @p_PersonalData)) 
       AND ([Name] IN (SELECT keyValue FROM p_PersonalData))) 
     else 
       ((SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 
       OR ([Address] IN (SELECT dictKey FROM p_PersonalData)) 
ORDER BY [...] 

info:它完美无缺地工作。选择语句和和/或是非常好的

问题是,sql服务器管理工​​作室红色突出显示等号'= 0',并表示他期望AND或THEN,但是有一个'然后'...

+1

编辑你的问题,并提供样本数据和所需的结果。另外,使用您正在使用的数据库标记。 –

+0

'CASE WHEN'不属于'WHERE'子句。没有必要在那里构造条件,因为子句已经*是一个条件,您可以将子表达式与“AND”,“OR”和括号组合在一起。除此之外,我不知道你在做什么:-)按照戈登的建议,并显示样本数据和预期结果。 (是的,只要有SQL问题,就给DBMS添加标签。) –

+4

T-SQL没有“布尔表达式”作为第一级公民 - 你不能使用布尔表达式作为结果,并且没有(显式的) 'TRUE'或'FALSE'。因此,无论对我们有多大的意义,“CASE WHEN ... Then END”都不合法。将其重写为'AND(([Name] IN ... AND ...)或NOT([Name] IN)... AND ...)'形式的东西。 –

回答

1

你有条件在你的“then/else”块。像这样的事情:

else 
       ((SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 
       OR ([Address] IN (SELECT dictKey FROM p_PersonalData)) 

是无效的语法。

试试这个,而不是。请注意,WHERE子句中的情况可能非常低效,您应该考虑以更实质的方式重构此查询。但是,这应该让你离开地面:

SELECT * 
from myTable 
where (1=1) 
    AND (@p_ID is null or [Id] = @p_ID) 
    AND case when [Name] IN (SELECT keyValue FROM @p_PersonalData) 
      then case when (
          (SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 
          OR 
          ([Address] IN (SELECT dictKey FROM @p_PersonalData)) 
          AND 
          ([Name] IN (SELECT keyValue FROM p_PersonalData)) 
         ) 
         then 1 
         else 0 
       end 
      else case when (
          (SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0 OR ([Address] IN (SELECT dictKey FROM p_PersonalData) 
         ) 
        then 1 
        else 0 
       end 
     end = 1 
ORDER BY [...] 
相关问题