我可以使用 SQL 服务器中的派生列来执行 CASE 函数吗?

Can I use a derived column in SQL Server for performing a CASE function?

我有一个 'main' table,C1,它有一个记录标识符,它又可以链接到一个帐户或一个客户 ID。关系/链接存储在两个单独的 table 中,一个具有记录 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 服务器中看起来不错,因为我没有收到任何错误,但是当我执行时,我收到一个错误,指出 'LINKAGE' 不作为列存在 - 它不会,但是 coalesce 不会告诉编译器链接是 case 函数的基础吗?

如果需要进一步说明,请告诉我。

干杯, SQLGeekInTraining

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

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

SQL 服务器允许您使用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);

CASE 表达式中的 CAST() 似乎是多余的,除非您打算将结果保存到 table 中并且您想清楚类型。