从表返回值时使用case语句连接



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

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

我通常会做

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

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语句的其他人(和您自己)的文档。

最新更新