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

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

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

  1. ID ---- LINKAGE --- REL_TYPE
  2. C1 Record ID --- ABC123 --- ACCOUNT
  3. C1 Record ID --- 1235 ---- CUSTOMER
  4. C1 Record ID --- NULL ---- UNLINKED

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

  1. SELECT
  2. C1.ID,
  3. C1.Name,
  4. COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) AS LINKAGE,
  5. CASE
  6. WHEN LINKAGE LIKE '[A-Z]%' THEN CAST('ACCOUNT' AS varchar(255))
  7. WHEN LINKAGE LIKE '10%' THEN CAST('CUSTOMER' AS varchar(255))
  8. ELSE 'Unlinked'
  9. END AS REL_TYPE
  10. FROM C1
  11. LEFT JOIN C2 ON C1.ID = C2.ID
  12. LEFT JOIN C3 ON C1.ID = C3.ID

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

2admgd59

2admgd591#

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

  1. SELECT
  2. C1.ID,
  3. C1.Name,
  4. COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) AS LINKAGE,
  5. CASE
  6. WHEN COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) LIKE '[A-Z]%' THEN CAST('ACCOUNT' AS
  7. varchar(255))
  8. WHEN COALESCE (C2.ACC_ID, C3.CUSTOMER_ID) LIKE '10%' THEN CAST('CUSTOMER' AS
  9. varchar(255))
  10. ELSE 'Unlinked'
  11. END AS REL_TYPE
  12. FROM C1
  13. LEFT JOIN C2 ON C1.ID = C2.ID
  14. LEFT JOIN C3 ON C1.ID = C3.ID
展开查看全部
iq3niunx

iq3niunx2#

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

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

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

相关问题