【发布时间】:2018-07-23 13:36:04
【问题描述】:
我想从存储过程中的表中选择记录。给定的参数可以是空的,也可以是包含一些用逗号分隔的键(1、2 等)的字符串 我想管理当参数为空字符串时,“WHERE”忽略搜索。 我正在使用此代码:
where (CASE when @PatientID <> 0 then ( dental.ID_Sick in (1,2)) else (1=1) end)
类似的东西正在 W3School 中工作。我的意思是:
SELECT * FROM Customers
WHERE (case when 1=1 then (Country IN ('Germany', 'France', 'UK')) else 1=1 end);
我的查询中有什么问题不起作用? SQLServerManagementStudio 在“IN”语句中给出错误。
【问题讨论】:
-
在 WHERE 子句中使用 AND/OR 结构而不是 case 表达式通常会更好。
-
@jarlh 怎么办?
-
参考这个,类似的问题在这里解释。 stackoverflow.com/questions/11232267/…
-
@Shaho 不要。 “动态”过滤器会导致错误的执行计划。如果您不想想要使用@PatientID 参数,不要使用@PatientID 参数。 不要创建这样的
catch-all存储过程。如果您需要使用不同的参数,请使用像 EF 和 LINQ 这样的 ORM -
当前语法的问题是没有布尔结果。 CASE 表达式只是硬币的一面。这不是
CASE声明,这是您理解错误的地方。CASE i WHEN 1 then 'Left' ELSE 'Right' END = 'Right'将是WHERE的布尔结果。您不要将布尔逻辑放在WHEN/ELSE旁边。
标签: sql sql-server tsql case where