在 where 子句 SQL 中的 case 语句中使用参数
Posted
技术标签:
【中文标题】在 where 子句 SQL 中的 case 语句中使用参数【英文标题】:Using parameters in case statements in where clause SQL 【发布时间】:2013-11-27 12:51:49 【问题描述】:我需要使用 s-s-rs 创建报告,但我在参数方面遇到了一些困难。 我有 3 个参数,开始日期、结束日期和 SalesID。
这是我需要做的事情的清单;
1-日期可以为空,如果为空,所有日期都应该在报告中(我想这里需要一个案例声明)
2- SalesID 是手动输入的,可以是多个值或空值。如果为 null,则所有 salesid 都应纳入报告。
到目前为止,我对 SalesId 和日期进行了类似的尝试,下面是一条查询;
AND ST.CREATEDDATE BETWEEN (@Baslangic) and (@Bitis)
AND CASE CPDR.SALESID WHEN @SalesID THEN @SalesID
WHEN NULL THEN 'Hepsi' END
(Hepsi 在我的母语中的意思是“全部”,所以在参数选择中有点欺骗 s-s-rS,不确定它是否有效。其他参数也只是“开始”和“结束”。)
我在 case 语句中收到“在预期条件的上下文中指定的非布尔类型的表达式”错误,不知道该怎么做。
我做错了什么?
【问题讨论】:
SalesID... can be multiple value or null
: 那么SalesID的参数类型是什么?你如何传递多个值?
预先警告:像这样的“聪明”逻辑开关结构通常在 SQL 代码中表现不佳。
@RaphaëlAlthaus 多值是关于 s-s-rS 的。
【参考方案1】:
我认为是这样的
AND XXXX = CASE CPDR.SALESID WHEN @SalesID THEN @SalesID
WHEN NULL THEN 'Hepsi' END
将等于@SalesID 或“Hepsi”的内容是什么? 您似乎缺少要与之比较的 case 语句前面的内容(因此出现布尔表达式错误)。我在示例中添加了 XXXX。
编辑 - 除非您在示例之后有更多 WHEN 案例,否则请使用 ELSE 而不是最后一个 WHEN:
ELSE 'Hepsi' END
【讨论】:
【参考方案2】:像这样尝试 smt:
AND (@Baslangic is null OR ST.CREATEDDATE BETWEEN (IsNull(@Baslangic,GETDATE())) and (isNull(@Bitis,GETDATE())))
AND (@SalesID is null OR CPDR.SALESID IN (@SalesID))
【讨论】:
以上是关于在 where 子句 SQL 中的 case 语句中使用参数的主要内容,如果未能解决你的问题,请参考以下文章
在 where 子句 SQL 中的 case 语句中使用参数
具有另一个 sql 语句的 where 子句中的 case 条件
sql server 2008 r2:当前会计年度 where 子句中的 case 语句