我有一个简单的选择:
DECLARE @ReportType AS VARCHAR(255) = 'Machine'
SELECT
[WOCust3] AS [Machine]
FROM MyTable WHERE
(@ReportType IS NULL
OR [WOCust3] LIKE (CASE WHEN @ReportType = 'Slack'
THEN '%Slack test%'
ELSE '%'
END
))
正如你所看到的,我使用这个case来比较变量是否等于Slack,然后根据该字段进行过滤;问题出在else子句中。当报告类型等于另一个字符串,它抛出所有结果,包括Slack测试结果,我想得到所有除了Slack测试结果,我怎么能做到这一点?
我重新工作了您的CASE
表达式,以更好地处理@ReportType
不是Slack
的实例。
SQL:
DECLARE @ReportType AS VARCHAR(255) = 'Machine'
SELECT
a.Machine_Name
FROM
Machine_Data a
WHERE
a.Machine_Name IN (
CASE
WHEN @ReportType = 'Slack' AND a.Machine_Name LIKE '%Slack test%' THEN a.Machine_Name
WHEN ISNULL(@ReportType, 'N/A') <> 'Slack' AND a.Machine_Name NOT LIKE '%Slack test%' THEN a.Machine_Name
END)
Machine
或NULL
作为ReportType
的结果:
| Machine_Name |
|--------------|
| Machine 1 |
| Machine 2 |
| Other |
| Test |
| Dev |
Result withSlack
asReportType
:
| Machine_Name |
|--------------|
| Slack test |
SQL小提琴:
http://sqlfiddle.com/!18/ca614/13
您可以将case
表达式分解为以下几部分:
where case
when @ReportType is NULL then 1
when @ReportType = 'Slack' and WOCust3 like '%Slack test%' then 1
when @ReportType <> 'Slack' and WOCust3 not like '%Slack test%' then 1
else 0 end = 1;
请注意,这种逻辑可能会影响性能。
建议阅读:Dynamic Search Conditions in T-SQL.