我可以使用 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 中并且您想清楚类型。
我有一个 '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 中并且您想清楚类型。