【问题标题】:Join with case statement when returning values from table从表中返回值时加入 case 语句
【发布时间】:2015-10-13 06:06:23
【问题描述】:

我需要这个查询从 REPORT 表中返回两个值,SUBJECT 和 ID_NUM。

正常选择主题,但只有在 IMS 表中的 SECRET 设置为 N 时才应选择 ID_NUM。

我通常会这样做

join on REPORT.ID_NUM = IMS.IR_ID_NUM

但在 SELECT 语句中,在指定 WHERE 表之前,我不确定如何在 SELECT 部分执行此操作。

SELECT SUBJECT,

--Check if secret before selecting values
--Secret column is in IMS table, value i want selected is in REPORT
CASE

    WHEN (SECRET = 'N') THEN ID_NUM     
    ELSE 'SECRET' END                                                                                
    AS 'ID_NUM  ',

FROM REPORT

    INNER JOIN IMS ON ID_NUM = IR_ID_NUM
    INNER JOIN IR_SUBJECT ON IR_ID_NUM = SUB_ID_NUM

【问题讨论】:

  • 现在输出什么?
  • 如果 ID_NUM 不是 char 或 varchar,则需要使用 cast 或 convert,因为在 else 情况下使用的是字符串
  • 那么你现在查询的结果是什么?

标签: sql-server tsql


【解决方案1】:

SQL 语句的不同子句(逻辑上)按一定顺序执行:

SELECT ...        // 5.
  FROM ...        // 1.
  JOIN ... ON ...
 WHERE ...        // 2.
 GROUP BY ...     // 3.
HAVING ...        // 4.
 ORDER BY ...     // 6.

按顺序排列:

  1. 所有记录都是选择FROM 的表,应用任何连接ON 条件,以及用逗号分隔的交叉连接表(,)。
  2. 根据WHERE 子句过滤记录。
  3. 记录是GROUP'ed。
  4. 根据HAVING 子句过滤分组值。
  5. 结果值为SELECT'd。 FROM 子句中列出的所有表中的列都可用,包括 JOIN 表。
  6. 结果行是ORDER'ed。您甚至可以按计算的结果值排序。

所以,SELECT 子句中的CASE 表达式可以毫无问题地访问SECRETID_NUM

注意:建议在给出多个表时始终限定列名。如果列名不明确(多个表具有相同名称的列),则必须这样做,但即使对于非模糊列名,您也应该这样做,作为稍后阅读 SQL 语句的其他人(和您自己)的文档。

【讨论】:

  • 谢谢,这是一个很好的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
相关资源
最近更新 更多