在连接两个值SQL时使用case语句

时间:2018-06-07 16:05:05

标签: sql sql-server

请参阅下面的屏幕截图

Screenshot

以下查询肯定应该将HELD_PARAM和HELD_VALUE字段一起作为HEADER加入

SELECT *
    ,ISNULL(HDR_PARAM, '')  + ISNULL(HELD_VALUE, '') AS HEADER  
FROM "dbo"."T_table" 

我试图对一个HELD_VALUE进行硬编码以反映不同的结果,如下面的屏幕截图所示。有人能告诉我查询有什么问题吗? Screenshot

SELECT *,
     ISNULL(HDR_PARAM, '')  + (ISNULL(HELD_VALUE, ''), 
                CASE WHEN HELD_VALUE = 'Y' THEN 'Z'
                ELSE HELD_VALUE
    END) AS HEADER
FROM "dbo"."T_table" 

3 个答案:

答案 0 :(得分:2)

您可以改用CONCAT。它忽略了NULL&#39>

SELECT *,
 CONCAT(HDR_PARAM,
        CASE 
        WHEN HELD_VALUE = 'Y' THEN 'Z'
        ELSE HELD_VALUE
        END) AS HEADER
FROM "dbo"."T_table" 

我知道CONCAT并不完全是标准的SQL。但是很多数据库都有它。 (虽然Oracle的版本只接受2个参数)

答案 1 :(得分:1)

您可以将CASE放在ISNULL内,如下所示:

SELECT *,
    ISNULL(HDR_PARAM, '')  +
    ISNULL
    (
        CASE WHEN HELD_VALUE = 'Y'
            THEN 'Z'
            ELSE HELD_VALUE END,
        ''
    ) AS HEADER
FROM "dbo"."T_table" 

答案 2 :(得分:1)

要复制第二个屏幕截图:

SELECT
*,
ISNULL(HDR_PARAM, '') AS HDR_PARAM,
ISNULL(HELD_VALUE, '') AS HELD_VALUE,
CASE
    WHEN HELD_VALUE = 'Y' THEN (HDR_PARAM + 'Z')
    ELSE (HDR_PARAM + HELD_VALUE)
    END AS HEADER
FROM "dbo"."T_table"

请注意,所有SQL引擎都不支持使用+的字符串concat;有些需要CONCAT函数或类似的方法。