具有串联列的SQL Server CASE

时间:2018-11-07 19:21:07

标签: sql sql-server sql-server-2012 concatenation case

我正在尝试创建一列,其值有条件地基于已指定的DB列。

我有6列:

ColumnA
ColumnB
ColumnC
ColumnD
ColumnE
ColumnF 

我在创建此列CUSTOMCODE的地方使用一个查询,该查询将基于6列的值确定,无论哪个为null。

我一直在使用CASE语句尝试生成所需的结果,但是有几行返回null。我的case陈述的逻辑如下

CASE
    WHEN ColumnA IS NOT NULL and ColumnB IS NOT NULL
         THEN ColumnA + '-' + ColumnC + '-' + ColumnD + '-' + ColumnB
    WHEN ColumnA IS NOT NULL  and ColumnB IS NULL
         THEN ColumnA + '-' + ColumnC + '-' + ColumnD
    WHEN ColumnE IS NOT NULL
         THEN ColumnE + '-' + ColumnF
END AS CUSTOMCODE

请注意该数据库中的数据,在本示例中,每行的ColumnB为NULL。

此查询运行时,对于ColumnA, ColumnC, and ColumnD不为空的第一行,它会正确返回第一种情况,并且CUSTOMCODE会得出一个非空值。

对于第二行,相同的ColumnA, ColumnC, and ColumnD也不为空,它为CUSTOMCODE返回NULL值,我不确定为什么。

以及后端的结构方式和数据输入方式,如果这3列为空,则ColumnE and ColumnF are not null,但是对于这种情况的行,其CUSTOMCODE也为NULL。

CASE语句中是否缺少某些内容,还是需要对其进行重组或执行其他操作?

3 个答案:

答案 0 :(得分:2)

最简单的方法似乎是将它们全部包装在NULL

CASE
    WHEN ColumnA IS NOT NULL and ColumnB IS NOT NULL
        THEN ColumnA + '-' + ISNULL(ColumnC, '') + '-' + ISNULL(ColumnD, '') + '-' + ColumnB
    WHEN ColumnA IS NOT NULL  and ColumnB IS NULL
        THEN ColumnA + '-' + ISNULL(ColumnC, '') + '-' + ISNULL(ColumnD, '')
    WHEN ColumnE IS NOT NULL
        THEN ColumnE + '-' + ISNULL(ColumnF, '')
END AS CUSTOMCODE

如果这不是您真正想要的,则需要记住,IS NULL语句将在第一个条件为我时退出。因此,您的select isnull(ColumnA,'') + isnull(ColumnB,'') + isnull(ColumnC,'') ...etc 的顺序很重要。

例如,永远不会遇到最后一个CASECASE ,因为在前两个CASE中也可能是WHEN ColumnE IS NOT NULL

  

请注意该数据库中的数据,在此示例中,ColumnB为NULL   每行。

如果这是真的,那么如果CASE不是TRUE,则第三个CASE将永远不会发生,因为第二个ColumnANULL

  

对于第二行,其中相同的ColumnA,ColumnC和ColumnD也都不为null,它将为CUSTOMCODE返回NULL值,我不确定为什么。

您提供的代码绝对不会发生这种情况。但是,重要的是要了解CASE空空间不是一回事。即WHEN ColumnA IS NOT NULL and ColumnB IS NULL永远不会为真。

最后,请记住,任何东西+ NULL = select 'true' where NULL = ''。即NULL将返回NULL

答案 1 :(得分:1)

我对您的逻辑了解不多,但据我所知,您没有检查NULLColumnC和{{1 }},如果其中之一是ColumnD,则您的字段ColumnF将是NULL

尝试一下:

CUSTOMCODE

尽管我建议您检查脚本的逻辑,也许您只能使用ISNULL()(?)

答案 2 :(得分:1)

我想你想要

select stuff( coalesce('-' + columna, '') +
              coalesce('-' + columnb, '') +
              coalesce('-' + columnc, '') +
              coalesce('-' + columnd, '') +
              coalesce('-' + columne, '') +
              coalesce('-' + columnf, ''), 1, 1, ''
             ) as concatenated_together_with_hyphen

这等效于其他数据库中的concat_ws()