MySQL查询中的CONCAT值忽略NULL值

时间:2013-09-16 16:11:49

标签: php mysql

我想在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

4 个答案:

答案 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