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 - 使用不在列表中的列对 Group By 语句排序 [重复]