我想在8个字段(sp,lp,gp,sr,zd,md,pr,rs)中CONCAT值,并将结果作为“化学”返回。问题是任何一条记录在8种可能的情况下只有两个(可能是三个或四个)值,其余的值将为NULL。此外,如果值为NULL,我既不希望显示前面的文本(SP:,LP:,GP:,SR:等等......),也不需要显示(换行符)。
根据我在这里的研究,我遇到了CONCAT_WS()和IFNULL()。我需要帮助实现这些功能,以达到我想要的结果。
CONCAT(
'SP: ', sp, '<br />',
'LP: ', lp, '<br />',
'GP: ', gp, '<br />',
'SR: ', sr, '<br />',
'ZD: ', zd, '<br />',
'MD: ', md, '<br />',
'PR: ', pr, '<br />',
'RS: ', rs
) AS chemistry
答案 0 :(得分:2)
您可以在此处使用两个事实:首先,CONCAT(与许多其他SQL函数一样)如果任何参数为NULL
则返回NULL
;第二,CONCAT_WS只会跳过NULL
个值。
这使查询简单到......
CONCAT_WS('<br />',
CONCAT('SP:', sp),
CONCAT('LP:', lp),
...
) AS chemistry
说完这一切之后,我真的很想知道是否有必要在查询(数据库)级别进行此格式化。首先,使用<br />
来分隔元素实际上只是一个表示的细节 - 它可能会比你想要的更频繁地改变。其次,在应用程序级别编写和调整此代码可能要容易得多 - 例如,使用循环。
答案 1 :(得分:1)
你想要这样的东西,你连接每个元素并与NULL
比较(我更喜欢COALESCE()
,因为它是ANSI标准):
CONCAT(
coalesce(concat('SP: ', sp, '<br />'), ''),
coalesce(concat('LP: ', lp, '<br />'), ''),
coalesce(concat('GP: ', gp, '<br />'), ''),
coalesce(concat('SR: ', sr, '<br />'), ''),
coalesce(concat('ZD: ', zd, '<br />'), ''),
coalesce(concat('MD: ', md, '<br />'), ''),
coalesce(concat('PR: ', pr, '<br />'), ''),
coalesce(concat('RS: ', rs, '<br />'), '')
) AS chemistry;
问题是最终'<br />'
。我刚刚将它添加到所有行,包括最后一行。如果你真的不想要它,那么我的建议是将其删除,但这可能有点挑战。
答案 2 :(得分:0)
它会很混乱,但你总能做到这一点:
CONCAT(
...
IF(gp IS NULL, '', CONCAT('GP:', gp, '<br/>')),
...
)
现在请记住,在查询中使用HTML通常表明您的疑虑很混乱。数据库应关注数据,而不是表示。
答案 3 :(得分:0)
您可以使用:
CONCAT(
IF (sp IS NULL, '', CONCAT('SP: ', sp, '<br />')),
IF (lp IS NULL, '', CONCAT('LP: ', lp, '<br />')),
IF (gp IS NULL, '', CONCAT('GP: ', gp, '<br />')),
IF (sr IS NULL, '', CONCAT('SR: ', sr, '<br />')),
IF (zd IS NULL, '', CONCAT('ZD: ', zd, '<br />')),
IF (md IS NULL, '', CONCAT('MD: ', md, '<br />')),
IF (pr IS NULL, '', CONCAT('PR: ', pr, '<br />')),
IF (rs IS NULL, '', CONCAT('RS: ', rs))
) AS chemistry