3

我想 CONCAT 8 个字段(sp、lp、gp、sr、zd、md、pr、rs)中的值,并将结果作为“化学”返回。问题是任何一条记录在 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

4 回答 4

2

您可以在这里使用两个事实:首先,如果任何参数为,则CONCAT(与许多其他 SQL 函数一样)返回;其次,CONCAT_WS只会跳过值。NULLNULLNULL

这使得查询变得简单......

CONCAT_WS('<br />',
   CONCAT('SP:', sp),
   CONCAT('LP:', lp),
   ...
) AS chemistry

说了这么多,我真的想知道是否有必要在查询(数据库)级别进行这种格式化。首先,使用<br />分隔元素实际上只是表示的一个细节——它的变化比你想要的要频繁得多。其次,在应用程序级别编写和调整此代码可能要容易得多——例如,通过使用循环。

于 2013-09-16T16:16:36.800 回答
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 />'。我只是将它添加到所有行中,包括最后一行。如果您真的不想要它,那么我的建议是之后将其删除,但这可能有点挑战。

于 2013-09-16T16:17:00.867 回答
0

这会很乱,但你总是可以这样做:

CONCAT(
  ...
  IF(gp IS NULL, '', CONCAT('GP:', gp, '<br/>')),
  ...
)

现在请记住,在您的查询中包含 HTML 通常表明您对您的担忧感到困惑。数据库应该关注数据,而不是表示。

于 2013-09-16T16:16:50.480 回答
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
于 2013-09-16T16:16:53.753 回答