SQL Where语句带CASE变量
对不起,我没有一个完整的查询,因为我的原文实际上很长,但我觉得你可能能够发现我的语法错误。基本上我声明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
即使我能使用类似的语句得到查询的片断我可以计算出地雷,但我无法找到任何类似的事情。任何帮助极大地赞赏
一般来说,你不想在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
返回布尔表达式。以上解决这个“限制”。
我认为这可能会忽略逻辑漏洞 - 您的解决方案与OP代码执行的操作相同:它只检查pDXIN是否为空,并且不检查inDDXNOTIN。如果他们都是空的呢?如果两者都不是空的呢? – Scott
@Scott。 。 。语法错误是'else'子句的布尔表达式。查询有几个问题,我试图解决。 –
所以上面的代码看起来像它可能会帮助,但它会带回我在结果 –
用你正在使用的数据库标记你的问题。 –
你能提供'@ inpDXNOTIN'的样本值和'@ inpDXIN'是他们的字符串,内存表等吗? – gordy