我可以使用SQLServer中的派生列来执行case函数吗?

mpbci0fu  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(319)

我有一个“main”表c1,它有一个记录标识符,该标识符又可以链接到帐户或客户id。关系/链接存储在两个单独的表中,一个表具有记录id-帐户级别的关系,另一个表具有记录id-客户级别的关系。c1记录可能同时具有客户关系和客户关系。
我正在尝试创建一个连接,以便将关系引入一个整洁的视图中,在该视图中,我希望得到如下输出:

ID         ---- LINKAGE --- REL_TYPE
C1 Record ID --- ABC123 --- ACCOUNT
C1 Record ID --- 1235 ---- CUSTOMER
C1 Record ID --- NULL ---- UNLINKED

从上面可以清楚地看到,帐户是字母数字的,而客户id是数字的。我在coalesce中使用它来派生“linkage”列,它本身并不存在。
我的代码当前如下所示:

SELECT 
     C1.ID,
     C1.Name,
     COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) AS LINKAGE,
     CASE 
        WHEN LINKAGE LIKE '[A-Z]%' THEN CAST('ACCOUNT' AS varchar(255))
        WHEN LINKAGE LIKE '10%' THEN CAST('CUSTOMER' AS varchar(255))
        ELSE 'Unlinked'
     END AS REL_TYPE

FROM C1

LEFT JOIN C2 ON C1.ID = C2.ID
LEFT JOIN C3 ON C1.ID = C3.ID

从语法上讲,代码在sql server中看起来很好,因为我没有得到任何错误,但是当我执行时,我得到了一个错误,即“linkage”不以列的形式存在—它不存在,但是coalesce不会告诉编译器链接是case函数的基础吗?
如果需要进一步澄清,请告诉我。
干杯,我们在训练

2admgd59

2admgd591#

请使用下面的查询。不能在case语句中使用链接,因为它是别名而不是原始数据库列。必须在函数中使用实际列名,而不是别名

SELECT 
   C1.ID,
   C1.Name,
   COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) AS LINKAGE,
   CASE 
     WHEN COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) LIKE '[A-Z]%' THEN CAST('ACCOUNT' AS 
     varchar(255))
     WHEN COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) LIKE '10%' THEN CAST('CUSTOMER' AS 
     varchar(255))
    ELSE 'Unlinked'
 END AS REL_TYPE

FROM C1

LEFT JOIN C2 ON C1.ID = C2.ID
LEFT JOIN C3 ON C1.ID = C3.ID
iq3niunx

iq3niunx2#

sql server允许您使用 APPLY 关键字中定义列别名 FROM 条款。这将简化您的逻辑:

SELECT C1.ID, C1.Name, v.LINKAGE,
       (CASE WHEN v.LINKAGE LIKE '[A-Z]%' THEN CAST('ACCOUNT' AS varchar(255))
             WHEN v.LINKAGE LIKE '10%' THEN CAST('CUSTOMER' AS varchar(255))
             ELSE 'Unlinked'
        END) AS REL_TYPE
FROM C1 LEFT JOIN
     C2
     ON C1.ID = C2.ID LEFT JOIN
     C3 
     ON C1.ID = C3.ID CROSS APPLY
     (VALUES (COALESCE(C2.ACC_ID, C3.CUSTOMER_ID))) v(LINKAGE);

这个 CAST()CASE 表达式似乎是多余的,除非您的目的是将结果保存到表中,并且您希望清楚地了解类型。

相关问题