CAS中对COALESCE的CASE声明

时间:2017-04-28 13:31:59

标签: sql sql-server

我在 SQL 中有COALESCE语句,如下所示:

有人请协助在SQL中使用COALESCE功能吗?谢谢。乔

我到目前为止编码为

COALESCE(IFRM.NAME + '_' + IFRM.TAG,  + '_' +ISNULL('_'+ LFRM.NAME, ''))+ '-->' + '_'+ ITO.NAME +'_'+ ITO.TAG +ISNULL('_'+ LTO.NAME, '') AS TEST,

矿产量:

TEST
DAL_L-->_JBU_U_HAL
JBU_U-->_UAE_E
AAL_L-->_KLM_M_ASA
(null)
(null)

下面是我用于CASE声明的表格

Main:
ID  FRM_IAD_ID  TO_IAD_ID   FRM_ATL_ID  TO_ATL_ID   FRM_ORD_ID  TO_ORD_ID   FRM_LAX_ID  TO_LAX_ID
9014    3215        1618                                                                1149
9014    1618        1407                                                    1149
9051    1600        1601                                                                1137
9051    1601                              1688                              1137
9059    6108                                                    9764

IAD:
ID  Name    tag
1407    UAE E
1600    AAL L
1601    KLM M
1618    JBU U
3215    DAL L
6108    EVA A

ATL:    
ID  Name        Tag
1688    Japan Airlines

ORD:
ID  name    Tag
9764    QTR

LAX:
ID  Name    Tag
1137    ASA
1149    HAL

2 个答案:

答案 0 :(得分:2)

以下是使用COALESCE()STUFF()的方法:

(STUFF(COALESCE('_' + IFRM.NAME, '') + COALESCE('_' + IFRM.TAG, '') + COALESCE('_' + LFRM.NAME, ''),
       1, 1, ''
      ) + '-->' +  -- if you want spaces, use `' --> '`
 STUFF(COALESCE('_'+ ITO.NAME, '') + COALESCE('_' + ITO.TAG, '') + COALESCE('_' + LTO.NAME, ''),
       1, 1, '')
) AS TEST,

我们的想法是将'_'添加到所有组件,然后使用STUFF()删除第一个组件。

我注意到CASE在箭头周围有空格。您的示例代码没有。

其他一些数据库支持CONCAT_WS()这样的功能,这使得这更加简单。

答案 1 :(得分:0)

您无需将Case转换为Coalesce。 Coalesce只是一个case语句的简写,其中每个值都测试为null。您的case语句结构比尝试将其插入Coalesce语句更受欢迎,并且您将无法在Coalesce结构中干净地测试多个字段。

看起来您可能会问如何阻止从Case语句返回null。您需要添加一个始终求值为非空值的Else语句。

顺便说一句,Coalesce语句的最后一个元素也作为Else子句处理。不要求Coalesce返回非空值。只要分配了数据类型,就可以返回null。