2017-05-08 139 views
0

对不起,我没有一个完整的查询,因为我的原文实际上很长,但我觉得你可能能够发现我的语法错误。基本上我声明2个变量,如果一个变量是空白的,我需要where语句成为该字段不在其他变量中的地方。SQL Where语句带CASE变量

Where dnCP_FromServiceDate >= '01/01/2016' And 
dnCP_FromServiceDate <= '01/31/2016' And 
dnCP_RecordStatus <> 'V' 
AND CASE WHEN @inpDXIN = '' THEN 
predxDiagnosisCode not in (@inpDXNOTIN) 
ELSE predxDiagnosisCode IN (@inpDXIN) 
END 

即使我能使用类似的语句得到查询的片断我可以计算出地雷,但我无法找到任何类似的事情。任何帮助极大地赞赏

+0

用你正在使用的数据库标记你的问题。 –

+0

你能提供'@ inpDXNOTIN'的样本值和'@ inpDXIN'是他们的字符串,内存表等吗? – gordy

回答

1

一般来说,你不想在where子句中使用case。相反,只要使用正规布尔逻辑:

Where dnCP_FromServiceDate >= '2016-01-01' and 
     dnCP_FromServiceDate <= '2016-01-31' and 
     dnCP_RecordStatus <> 'V' and 
     ((@inpDXIN = '' and predxDiagnosisCode <> @inpDXNOTIN) or 
     (@inpDXIN <> '' and predxDiagnosisCode IN (@inpDXIN) 
    ) 

注:

  • 使用ISO/ANSI标准日期格式。更不明确。
  • IN (@var)= @var相同。您无法通过变量传递in列表。如果您需要该功能,请询问另一个的问题。
  • SQL的大多数方言不允许从case返回布尔表达式。以上解决这个“限制”。
+0

我认为这可能会忽略逻辑漏洞 - 您的解决方案与OP代码执行的操作相同:它只检查pDXIN是否为空,并且不检查inDDXNOTIN。如果他们都是空的呢?如果两者都不是空的呢? – Scott

+0

@Scott。 。 。语法错误是'else'子句的布尔表达式。查询有几个问题,我试图解决。 –

+0

所以上面的代码看起来像它可能会帮助,但它会带回我在结果 –