我正在尝试创建一列,其值有条件地基于已指定的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语句中是否缺少某些内容,还是需要对其进行重组或执行其他操作?
答案 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
的顺序很重要。
例如,永远不会遇到最后一个CASE
,CASE
,因为在前两个CASE
中也可能是WHEN ColumnE IS NOT NULL
。
请注意该数据库中的数据,在此示例中,ColumnB为NULL 每行。
如果这是真的,那么如果CASE
不是TRUE
,则第三个CASE
将永远不会发生,因为第二个ColumnA
是NULL
。
对于第二行,其中相同的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)
我对您的逻辑了解不多,但据我所知,您没有检查NULL
,ColumnC
和{{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()
。