MySql:连接 IF 值

Zim*_*bim 6 mysql

尝试找到一种方法将 CONCAT 与 IF \xe2\x80\x93 结合起来或以其他方式显示\n以逗号分隔的列表中设置标志的文本值。

\n\n

注意:这最终适用于具有 10+ 列的表。这里使用两个来简化。

\n\n

假设我有一张带有旗帜的桌子。如果标志是1我想显示一些文本值,则什么也不显示。

\n\n
origin:\n+--+-----+-----+\n|# | CHS | ACC |\n+--+-----+-----+\n|1 | 0   | 1   |\n|2 | 1   | 1   |\n|3 | 1   | 0   |\n|4 | 0   | 0   |\n+--+-----+-----+\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想:

\n\n
+--+----------+\n|# |  origin  |\n+--+----------+\n|1 | ACC      |\n|2 | CHS, ACC |\n|3 | CHS      |\n|4 |          |\n+--+----------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

不是(这个或类似的):

\n\n
+--+-----------+\n|# | origin    |\n+--+-----------+\n|1 | ACC,      |\n|2 | CHS, ACC, |\n|3 | CHS,      |\n|4 | ,         |\n+--+-----------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

朝着这个方向的东西:

\n\n
SELECT\n    CONCAT_WS(', ',\n        IF(CHS = 0, '', 'CHS'),\n        IF(ACC = 0, '', 'ACC')\n    ) as origin\nFROM\n    origin;\n
Run Code Online (Sandbox Code Playgroud)\n\n

但空值之间不能用逗号。

\n\n

这最终是针对一个包含 10 列的表,我将其与其他基于\非 id 的表连接起来。

\n

fth*_*lla 5

您可以将跳过 NULL 值的 CONCAT_WS 与 CASE 结合使用:

SELECT
  id,
  CONCAT_WS(', ',
    CASE WHEN CHS THEN 'CHS' END,
    CASE WHEN ACC THEN 'ACC' END
  ) as origin
FROM
  origin;
Run Code Online (Sandbox Code Playgroud)

当条件为FALSE时,由于我没有指定ELSE子句,CASE将返回NULL值,而CONCAT_WS将跳过它。您还可以在原始查询中使用 NULL 而不是 ''。

如果您有很多列,您还可以创建一个动态查询,如下所示:

SELECT
  CONCAT(
    'SELECT ID, CONCAT_WS(\', \',',
    GROUP_CONCAT(
      CONCAT(
        'CASE WHEN ',
        `COLUMN_NAME`,
        ' THEN \'',
        `COLUMN_NAME`,
        '\' END') SEPARATOR ','),
    ') AS origin FROM origin;'
    )
FROM
  `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE
  `TABLE_NAME`='origin'
  AND COLUMN_NAME!='id'
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;
Run Code Online (Sandbox Code Playgroud)

请参阅小提琴,这里有两种解决方案。