尝试找到一种方法将 CONCAT 与 IF \xe2\x80\x93 结合起来或以其他方式显示\n以逗号分隔的列表中设置标志的文本值。
\n\n注意:这最终适用于具有 10+ 列的表。这里使用两个来简化。
\n\n假设我有一张带有旗帜的桌子。如果标志是1我想显示一些文本值,则什么也不显示。
origin:\n+--+-----+-----+\n|# | CHS | ACC |\n+--+-----+-----+\n|1 | 0 | 1 |\n|2 | 1 | 1 |\n|3 | 1 | 0 |\n|4 | 0 | 0 |\n+--+-----+-----+\nRun 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+--+----------+\nRun 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+--+-----------+\nRun Code Online (Sandbox Code Playgroud)\n\n朝着这个方向的东西:
\n\nSELECT\n CONCAT_WS(', ',\n IF(CHS = 0, '', 'CHS'),\n IF(ACC = 0, '', 'ACC')\n ) as origin\nFROM\n origin;\nRun Code Online (Sandbox Code Playgroud)\n\n但空值之间不能用逗号。
\n\n这最终是针对一个包含 10 列的表,我将其与其他基于\非 id 的表连接起来。
\n您可以将跳过 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)
请参阅小提琴,这里有两种解决方案。
| 归档时间: |
|
| 查看次数: |
4647 次 |
| 最近记录: |