在 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 语句

SQL 在 WHERE IN 子句中使用 CASE 语句

如何在 SQL Server 的 Where 子句中使用 case 语句

Oracle SQL的Where子句中如何写case语句?