[英]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.