首页 > 解决方案 > 使用 CASE WHEN 将数字列表添加到查询中

问题描述

是否可以在下面的查询中添加数字列表:

DECLARE @MONTHS NVARCHAR(10)
DECLARE @YEAR NVARCHAR(10)

BEGIN
    SET @MONTHS = 'Q1'
    SET @YEAR = '2017'

    SELECT * 
    FROM netlication.dbo.iehResults
    WHERE DATEPART(yyyy,COLLDATE) = CAST(@YEAR AS INT)
      AND DATEPART(mm,collDate) IN (CASE @MONTHS WHEN 'Q1' THEN '1' End)
END

上面的查询工作正常,但对于值 Q1 我希望能够传递数字 1,2 和 3 的列表

所以我试着做:

AND DATEPART(mm, collDate) IN (CASE @MONTHS WHEN 'Q1' THEN '1,2,3' End)

但我得到一个转换错误:

消息 245,级别 16,状态 1,第 9
行将 varchar 值“1,2,3”转换为数据类型 int 时转换失败。

标签: sqlsql-servertsql

解决方案


而不是DATEPART(mm,collDate)您可以使用DATEPART(q,collDate)which 将返回季度,您不需要与 3 个值进行比较。但要比较,您必须使用betweenand 2case语句。

DECLARE @MONTHS NVARCHAR(10)
DECLARE @YEAR NVARCHAR(10)
BEGIN
SET @MONTHS = 'Q1'
set @YEAR = '2017'
SELECT * FROM netlication.dbo.iehResults
WHERE DATEPART(yyyy,COLLDATE) = CAST(@YEAR AS INT)
AND DATEPART(q,collDate) = (CASE @MONTHS WHEN 'Q1' THEN 1 WHEN 'Q2' THEN 2 WHEN 'Q3' THEN 3 WHEN 'Q4' THEN 4 End)
END

但是,在性能方面,最好计算季度的开始日期和结束日期,然后按它们之间的 COLLDATE 进行过滤:

set @StartDate = DATEFROMPARTS(@YAR, CASE @MONTHS
   WHEN 'Q1' THEN 1
   WHEN 'Q2' THEN 4
   WHEN 'Q3' THEN 7
   WHEN 'Q4' THEN 10 End, 1)
set @EndDate = DATEADD(q, 1, @StartDate)
SELECT * FROM netlication.dbo.iehResults
WHERE COLLDATE >= @StartDate and COLLDATE < @EndDate

推荐阅读