SQL - 如何从多个可能的列名称中 select?

SQL - How to select from mulitple possible columns names?

我需要从几个 table 中获取数据,但是我需要的最后一条数据可以来自三个 table 中的一个,并且每个 table 使用唯一的列名称。我试过在 select 中设置 CASE 语句,但显然我犯了语法错误。我在正确的轨道上吗?有没有更好的办法?这是一个 DB2 数据库。我的访问权限有限,不认为动态 SQL 或创建 table 是一个选项。

SELECT M1.MESSAGE_ID, M1.MESSAGE_NAME, M1.CREATED_DATETIME, M1.MESSAGE_SIZE, M2.PATH,
 case when select EXTRACTABLE_COUNT from MBX_EXTRACT_COUNT where exists (select M1.MESSAGE_ID from MBX_EXTRACT_COUNT)
    then select EXTRACTABLE_COUNT from MBX_EXTRACT_COUNT
 when select EXTRACTABLE_UNTIL from MBX_TIL_COUNT where exists (select M1.MESSAGE_ID from MBX_TIL_COUNT)
    then select EXTRACTABLE_UNTIL from MBX_TIL_COUNT
 when select EXTRACTABLE from MBX_EXTRACTABLE where exists (select M1.MESSAGE_ID from MBX_EXTRACTABLE)
    then select EXTRACTABLE from MBX_EXTRACTABLE
 end as EXTRACT_VALUE
FROM MBX_MESSAGE M1
 left JOIN MBX_MAILBOX M2
    ON M1.MAILBOX_ID = M2.MAILBOX_ID
 left JOIN MBX_EXTRACT_COUNT M3
    ON M1.MESSAGE_ID = M3.MESSAGE_ID     
 left JOIN MBX_EXTRACT_TIL M4
    ON M1.MESSAGE_ID = M4.MESSAGE_ID
 left JOIN MBX_EXTRACTABLE M5
    ON M1.MESSAGE_ID = M4.MESSAGE_ID

你为什么不做这样的事情:

LEFT JOIN ( 
         SELECT MESSAGE_ID,     
                EXTRACTABLE_COUNT EXTRACT_VALUE
           FROM MBX_EXTRACT_COUNT) M3
    ON M1.MESSAGE_ID = M3.MESSAGE_ID     
LEFT JOIN ( 
         SELECT MESSAGE_ID,     
                EXTRACTABLE_UNTIL EXTRACT_VALUE
           FROM MBX_EXTRACT_TIL) M4
    ON M1.MESSAGE_ID = M4.MESSAGE_ID
LEFT JOIN ( 
         SELECT MESSAGE_ID,     
                EXTRACTABLE EXTRACT_VALUE
           FROM MBX_EXTRACTABLE) M5
    ON M1.MESSAGE_ID = M5.MESSAGE_ID

这样所有的列都应该有相同的名字,那么COALESCE就足够了。

反正你最后的LEFT JOIN条件不对,应该是M5而不是M4

完全脱离了我的头脑:

SELECT 
  M1.MESSAGE_ID, 
  M1.MESSAGE_NAME, 
  M1.CREATED_DATETIME, 
  M1.MESSAGE_SIZE, 
  EV.EXTRACT_VALUE,
  M2.PATH
FROM MBX_MESSAGE MI
LEFT JOIN (
  SELECT 
    MESSAGE_ID, 
    EXTRACTABLE_COUNT AS EXTRACT_VALUE
  FROM MBX_EXTRACT_COUNT 

  UNION ALL

  SELECT
    MESSAGE_ID,
    EXTRACTABLE_UNTIL AS EXTRACT_VALUE
  FROM MBX_TIL_COUNT

  UNION ALL

  SELECT
    MESSAGE_ID,
    EXTRACTABLE AS EXTRACT_VALUE
  FROM MBX_EXTRACTABLE

) AS EV ON MI.MESSAGE_ID = EV.MESSAGE_ID
LEFT JOIN MBX_MAILBOX M2
  ON M1.MAILBOX_ID = M2.MAILBOX_ID

我相信这可以改进一点,但是像这样使用带有 UNION ALL 的子查询应该将所有内容都拉到一个名为 EXTRACT_VALUE

的列中