SQL CASE语句和多个条件

时间:2018-12-07 23:52:39

标签: sql case-statement

我正在编写一个基本的SQL查询,以在基于云的报告工具中构建表,该工具支持多种SQL“方言”(无服务器端对数据库的访问)。我对SQL有一定的了解,并且需要能够为特定的可视化构建基本表。具体来说,我需要在与原始表用逗号分隔的列表中可视化/量化值的每个唯一实例。对于我的示例,Col4具有以不同顺序排列的值a,b,c,d,需要对其进行计数和可视化以显示每个值在每个日期显示多少次(Col1)。

原始表格如下:

enter image description here

我正在使用CASE语句,因此我可以在新表中操纵Col4输出的标签,以便使其更易于可视化。

这是我的查询的简短示例:

SELECT 
    Col1, CoL2, 
    CASE 
       WHEN Col4 LIKE '%a' 
          THEN 'custom label for a' 
       WHEN Col4 LIKE '%b%' 
          THEN 'Custom Label for b' 
    END AS 'Column Label' 
FROM 
    Original_Table

所需的表(为了使可视化工作看起来像这样):

enter image description here

这样,无论原始表中Col4中逗号分隔列表中的位置如何,每次显示“ a”和“ b”时都会显示视觉效果(因此我可以显示“ a”和“ b”的出现次数每月“ b”)

问题是,如果满足第一个WHEN条件之一,则此CASE语句仅返回TRUE。例如,我看到的结果是,如果一个单元格同时包含“ a”和“ b”,则它将仅返回遇到的第一个TRUE条件,并且也不会从同一逗号分隔列表中返回“ b”。相反,如果在“ a”之前列出“ b”(顺序是可变的,因为选择来自最终用户填充的选择列表),则将“ b”返回“ TRUE”,而忽略“ a”。

从本质上讲,无论位置如何,以及同一个逗号分隔的列表中是否有两个值,如何调整此查询以返回?希望有道理,谢谢!

3 个答案:

答案 0 :(得分:1)

由于要从同一原始行返回多行,因此需要UNION ALL

SELECT Col1, 'Custom Label for a' AS Col4
  FROM Original_Table
 WHERE Col4 LIKE '%a%'
UNION ALL
SELECT Col1, 'Custom Label for b' AS Col4
  FROM Original_Table
 WHERE Col4 LIKE '%b%'
 ORDER BY Col1, Col4

答案 1 :(得分:0)

一段时间以来,我已经在Microsoft SQL Server中使用STUFFFOR XML PATH('')准备了逗号分隔的列表。

如果这种精确的语法对您不起作用,您可能仍会here找到一些有用的信息。

DECLARE @LetterTypes TABLE (Type CHAR(10))
INSERT @LetterTypes
    VALUES
    ('Consonant'),
    ('Vowell')

DECLARE @Letters TABLE (Letter CHAR(1) NOT NULL, Type VARCHAR(10) NOT NULL)
INSERT @Letters 
    VALUES
    ('A','Vowell'),
    ('B','Consonant'),
    ('C','Consonant'),
    ('D','Consonant'),
    ('E','Vowell'),
    ('F','Consonant'),
    ('G','Consonant'),
    ('H','Consonant'),
    ('I','Vowell'),
    ('J','Consonant'),
    ('K','Consonant'),
    ('L','Consonant'),
    ('M','Consonant'),
    ('N','Consonant'),
    ('O','Vowell'),
    ('P','Consonant'),
    ('Q','Consonant'),
    ('R','Consonant'),
    ('S','Consonant'),
    ('T','Consonant'),
    ('U','Vowell'),
    ('V','Consonant'),
    ('W','Consonant'),
    ('X','Consonant'),
    ('Y','Consonant'),
    ('Z','Consonant')


SELECT
    Type,
    STUFF
    (
        (
            SELECT ', ' + Letter
            FROM @Letters L
            WHERE LT.Type = L.Type
            ORDER BY L.Letter
            FOR XML PATH('')
        ), 1, 2, ''
    ) AS Letters
FROM @LetterTypes LT

输出:

Output

答案 2 :(得分:0)

我重新阅读了您的问题,我认为我现在更好了。您希望将abc转换成自定义标签,对吗?

为此,您可以使用多次调用REPLACE。忍受我!

SELECT 
    Col1, 
    CoL2, 
    REPLACE(
    REPLACE(
    REPLACE(Col4,
        'a', 'Custom Label for a'),
        'b', 'Custom Label for b'), 
        'c', 'Custom Label for c') as ReLabeledCol4
FROM Original_Table