SQL - 如何从多个可能的列名中进行选择?

Posted

技术标签:

【中文标题】SQL - 如何从多个可能的列名中进行选择?【英文标题】:SQL - How to select from mulitple possible columns names? 【发布时间】:2015-04-30 21:13:45 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

非常想不通:

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 的列中

【讨论】:

这成功了!我不得不做一些修改,因为我忘了提到 EXTRACTABLE_UNTIL 是一个日期值。感谢您的帮助【参考方案2】:

你为什么不做类似的事情:

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

【讨论】:

以上是关于SQL - 如何从多个可能的列名中进行选择?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从多个表中选择 *

MySQL 的列名中的通配符

如何在同一个sql查询中更新和选择记录

如何根据包含的字符串的一部分选择列,然后在 R 中删除部分列名? (列位置可能不同)

从具有特定值的表中获取列名

如何从java中的结果集中获取列名[重复]