获取除第一个case语句中的值外的所有数据



我有一个简单的选择:

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)

MachineNULL作为ReportType的结果:

| Machine_Name |
|--------------|
|    Machine 1 |
|    Machine 2 |
|        Other |
|         Test |
|          Dev |

Result withSlackasReportType:

| 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.

相关内容

最新更新