使用SELECT CASE WHEN,仅选择列的子集

时间:2018-09-24 20:24:16

标签: sql

我正在尝试从表中选择列val的子集,其中子集在一个时间范围内,并且该行的索引值也为23。我目前正在使用CASE来指定Index = 23和DateAndTime应该等于几天的计数变量(d @ daycnt)和小时的计数变量@hourcnt。

    SELECT 
    CASE WHEN Index=23 
    AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
    AND DATEPART(HOUR,DateAndTime)=@hourcnt THEN Val END
    FROM Table

使用上面的代码时,我选择整个列Val。我一直试图在THEN之后添加一个where条件,以指定我想要的Val子集,如下所示:

    SELECT 
    CASE WHEN Index=23 
    AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
    AND DATEPART(HOUR,DateAndTime)=@hourcnt THEN Val WHERE 

    Index=23 
    AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
    AND DATEPART(HOUR,DateAndTime)=@hourcnt END
    FROM Table

但这似乎不起作用。有谁知道如何在THEN之后指定列的子集。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

使用case语句将为您提供所有行的结果,但是Val仅在满足您的CASE条件时显示。

  

更新:您说过,您希望根据您的条件将值显示在其他列中。这可以用CASE或UNION完成。我认为UNION更易于阅读和解决。我将展示两种解决方案,让您决定。

听起来您只想包含匹配的行。如果这是您想要的,请不要使用CASE。而是将过滤器放在WHERE子句中。

示例数据:

Index  Val    DateAndTime      
-----  ---    -----------------
  5     6      9/24/2018 10:01 
  9     1      9/24/2018 10:01 
 23     9      9/24/2018 10:01 
 23    12      9/24/2018 10:01 
 25     4      9/24/2018 10:01 

您使用CASE进行的查询:

SELECT Index, 
       CASE Index WHEN 5 THEN Val ELSE NULL END AS Col1, 
       CASE Index WHEN 9 THEN Val ELSE NULL END AS Col2,
       CASE Index WHEN 23 THEN Val ELSE NULL END AS Col3,
       CASE Index WHEN 25 THEN Val ELSE NULL END AS Col4,
       DateAndTime
FROM Table
WHERE DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
  AND DATEPART(HOUR,DateAndTime)=@hourcnt

给出以下结果:

Index  Col1   Col2   Col3   Col4    DateAndTime
-----  ----   ----   ----   ----    -----------------
  5      6    null   null   null    9/24/2018 10:01
  9    null     1    null   null    9/24/2018 10:01
 23    null   null     9    null    9/24/2018 10:01
 23    null   null    12    null    9/24/2018 10:01
 25    null   null   null     4     9/24/2018 10:01

尝试在WHERE子句和UNION语句中使用过滤器进行此查询,以将其收集为一个查询结果:

SELECT Index, Val AS Col1, NULL AS Col2, NULL AS Col3, NULL AS Col4, DateAndTime
FROM Table
WHERE Index=5 --First row is in Col1
  AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
  AND DATEPART(HOUR,DateAndTime)=@hourcnt

UNION

SELECT Index, NULL AS Col1, Val AS Col2, NULL AS Col3, NULL AS Col4, DateAndTime
FROM Table
WHERE Index=9   --2nd row is in col 2
  AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
  AND DATEPART(HOUR,DateAndTime)=@hourcnt

UNION

SELECT Index, NULL AS Col1, NULL AS Col2, Val AS Col3, NULL AS Col4, DateAndTime
FROM Table
WHERE Index=23   --row 3 and 4 are in Col 3
  AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
  AND DATEPART(HOUR,DateAndTime)=@hourcnt

UNION

SELECT Index, NULL AS Col1, NULL AS Col2, NULL AS Col3, Val AS Col4, DateAndTime
FROM Table
WHERE Index=25
  AND DATEPART(DAYOFYEAR,DateAndTime)=@daycnt
  AND DATEPART(HOUR,DateAndTime)=@hourcnt

要产生此结果(与第一个查询相同):

Index  Col1   Col2   Col3   Col4    DateAndTime
-----  ----   ----   ----   ----    -----------------
  5      6    null   null   null    9/24/2018 10:01
  9    null     1    null   null    9/24/2018 10:01
 23    null   null     9    null    9/24/2018 10:01
 23    null   null    12    null    9/24/2018 10:01
 25    null   null   null     4     9/24/2018 10:01

您提到您想做一个INSERTCASE查询的语法非常相似。只需将INSERT语句放在您的CASE查询之前。但是,如果您想坚持使用UNION语法,我仍然认为查询将更易于解决,因为您可以将其分为4个单独的INSERT查询,而不是一个INSERTUNION查询。