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 - 如何从多个可能的列名中进行选择?的主要内容,如果未能解决你的问题,请参考以下文章