MySQL根据列值选择多列

Posted

技术标签:

【中文标题】MySQL根据列值选择多列【英文标题】:MySQL Select multiple column depending on column value 【发布时间】:2016-10-03 18:14:32 【问题描述】:

我在 Internet 和整个 Stackoverlow 上搜索了两次,但没有找到可行的解决方案。

假设我有一个包含以下列的表格: a,b,c,d,e,f,g,h,i

a 是一个从 1 到 16 的整数 根据这个值,我必须选择是否选择 b-i。

示例: 如果 a = 1 我需要 b,c,d,e,i。如果 a = 2 我需要 e,g,h,i

所以我可以使用:

SELECT
CASE a WHEN 1 THEN b WHEN 2 THEN NULL ELSE NULL END as a
....
CASE a WHEN 1 THEN NULL WHEN 2 THEN g ELSE NULL END as g

没有更简单的方法吗:

CASE a When 1 (select b,c,d,e,i)?

额外愿望:我可以根据 a 的值选择 as 吗?示例

if a = 1 column b should be named "lol", if a = 2 b should be called "rofl".

【问题讨论】:

您不能为结果中的不同行返回不同数量的列。 @Barmar 好吧,您可以再次取消旋转和动态旋转。但是很乱。 这类问题是糟糕设计的典型表现。 检查这个,看看你的表是如何反透视的***.com/questions/15184381/… 【参考方案1】:

我能想到的最接近您想要的是连接您想要的列:

SELECT CASE a
           WHEN 1 THEN CONCAT_WS(', ', b, c, d, e, i)
           WHEN 2 THEN CONCAT_WS(', ', e, g, h, i)
       END AS result

另一种解决方案是使用UNION

SELECT a, b, c, d, e, i
FROM yourTable
WHERE a = 1
UNION
SELECT a, e, g, h, i, null
FROM yourTable
WHERE a = 2

请注意,您不能根据a 的值使用不同的列别名。整个查询只有一组列名。在UNION 中,它们来自第一个子查询中的列名或别名。

【讨论】:

是的。如果你想把东西放在它的位置,使用IFNULL(e, 'something') 我认为这个解决方案不是我最喜欢的。我需要在 php 中处理这些列,所以爆炸和重命名它们并不漂亮:( 希望有人有另一个想法...... 我使用UNION添加了另一个解决方案。 为什么不直接返回所有列,然后在PHP中区分大小写? 我正在考虑性能...选择 50 列(其中 20 列为空)并在 php 中使用它们或使用 mysql 选择 20 列是否有明显差异?

以上是关于MySQL根据列值选择多列的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 分区知识点(二 )

MySQL - 根据联接表列值更新列值

mysql如何根据一列值更新另一列的值?

MySQL - 根据更新其他表列值触发更新列值

根据haversine距离公式选择不同的列值?

根据优先级参考表选择列值?