簡體   English   中英

我可以在 SQL 服務器中使用派生列來執行 CASE function 嗎?

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

我有一個“主”表 C1,它有一個記錄標識符,它又可以鏈接到一個帳戶或客戶 ID。 關系/鏈接存儲在兩個單獨的表中,一個具有記錄 ID - 帳戶級別關系,另一個具有記錄 ID - 客戶級別關系。 C1 記錄可能同時具有客戶關系和客戶關系。

我正在嘗試創建一個連接以將關系引入一個整潔的視圖,我正在尋找一個 output 如下:

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”不作為列存在 - 它不存在,但合並不會告訴編譯器認為鏈接是案例 function 的基礎?

如果需要進一步澄清,請告訴我。

干杯,SQLGeekInTraining

請使用以下查詢。 您不能在 case 語句中使用LINKAGE ,因為它是別名而不是原始數據庫列。 您必須使用實際的列名以及 function 而不是別名

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()似乎是多余的,除非您打算將結果保存到表中並且您想清楚類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM