MySQL从具有列名的select语句中的列列表中返回第一个非NULL值

Posted

技术标签:

【中文标题】MySQL从具有列名的select语句中的列列表中返回第一个非NULL值【英文标题】:MySQL Return the first non-NULL value from the list of the column in select statement with column name 【发布时间】:2017-02-21 11:29:47 【问题描述】:

我在下面有一个 sql 查询:

SELECT 
    md.refereeInternetSearch,
    md.refereeCompanyColleague,
    md.refereeIndustryPeer,
    md.refereeIndustryEvent,
    md.refereeIndustryPublication,
    md.refereeMarketingEmail,
    md.refereeOther
FROM
    marketing_details md
WHERE
    md.id = 14588

在上述 select 语句的 7 列中,只有一列有值,其余列为空。是否可以使用某种 sql 语句只选择一个不为空的列值?

【问题讨论】:

mysql SELECT only not null values的可能重复 【参考方案1】:

使用coalesce() 函数从参数列表中返回第一个非空值:

SELECT 
    coalesce(md.refereeInternetSearch,
    md.refereeCompanyColleague,
    md.refereeIndustryPeer,
    md.refereeIndustryEvent,
    md.refereeIndustryPublication,
    md.refereeMarketingEmail,
    md.refereeOther) as non_null_value
FROM
    marketing_details md
WHERE
    md.id = 14588

但是,它无法告诉您该值来自哪一列。

更新

如果你真的想使用 sql 来检索具有非 null 值的字段的名称,那么你可以使用下面的下面这个怪异的 sql 语句来做到这一点。它的作用是将记录中的每个字段值连接成一个字符串,其中的值用逗号分隔。 NULL 值被转换为空字符串。然后使用find_in_set() 函数找到上述字符串中唯一非空值的位置。然后使用elt() 函数,它根据find_in_set() 返回的位置从字段名称文字列表中返回字段名称。

SELECT
    md.id, 
    coalesce(md.refereeInternetSearch,
    md.refereeCompanyColleague,
    md.refereeIndustryPeer,
    md.refereeIndustryEvent,
    md.refereeIndustryPublication,
    md.refereeMarketingEmail,
    md.refereeOther) as non_null_value,
    elt(find_in_set(coalesce(md.refereeInternetSearch,
                                 md.refereeCompanyColleague,
                                 md.refereeIndustryPeer,
                                 md.refereeIndustryEvent,
                                 md.refereeIndustryPublication,
                                 md.refereeMarketingEmail,
                                 md.refereeOther),
                        concat(coalesce(md.refereeInternetSearch,''),',',
                               coalesce(md.refereeCompanyColleague,''),',',
                               coalesce(md.refereeIndustryPeer,''),',',
                               coalesce(md.refereeIndustryEvent,''),',',
                               coalesce(md.refereeIndustryPublication,''),',',
                               coalesce(md.refereeMarketingEmail,''),',',
                               coalesce(md.refereeOther,'')
                              ) 
                       ),'refereeInternetSearch',
                         'refereeCompanyColleague',
                         'refereeIndustryPeer',
                         'refereeIndustryEvent',
                         'refereeIndustryPublication',
                         'refereeMarketingEmail',
                         'refereeOther'
      ) as field_name 
FROM
    marketing_details md
WHERE
    md.id = 14588

嗯,我希望我把所有的括号都记对了!

【讨论】:

谢谢你的朋友,这正是我所需要的,但是有没有办法知道值来自哪一列? 好吧,我确实给了你一个解决方案,但我认为如果你使用适当的编程语言而不是 sql 来做这件事,你可能会做得更好。

以上是关于MySQL从具有列名的select语句中的列列表中返回第一个非NULL值的主要内容,如果未能解决你的问题,请参考以下文章

MySql语句中Union和join的用法

您可以将一个表中具有另一个表的列名的列与第二个表链接吗

如何在 Pyspark 的动态列列表中转义列名

MySQL - 使用不在列表中的列对 Group By 语句排序 [重复]

MySQL中INSERT,UPDATE和REPLACE的区别与用法

有啥方法可以扩展包含列表的 pandas Dataframe 中的列并从列表值本身中获取列名?