试图找到一种方法将CONCAT与IF结合 - 或以其他方式显示 逗号分隔列表中设置标志的文本值。
注意:最终这是一个包含10+列的表。在这里使用两个来简化。
说我有一张带旗帜的桌子。如果flag为1
我想显示一些文本值,
别的没什么。
origin:
+--+-----+-----+
|# | CHS | ACC |
+--+-----+-----+
|1 | 0 | 1 |
|2 | 1 | 1 |
|3 | 1 | 0 |
|4 | 0 | 0 |
+--+-----+-----+
我想:
+--+----------+
|# | origin |
+--+----------+
|1 | ACC |
|2 | CHS, ACC |
|3 | CHS |
|4 | |
+--+----------+
不(这个或类似):
+--+-----------+
|# | origin |
+--+-----------+
|1 | ACC, |
|2 | CHS, ACC, |
|3 | CHS, |
|4 | , |
+--+-----------+
朝着这个方向发展:
SELECT
CONCAT_WS(', ',
IF(CHS = 0, '', 'CHS'),
IF(ACC = 0, '', 'ACC')
) as origin
FROM
origin;
但空值之间没有逗号。
这最终是一个包含10列的表,我与其他表连接 在id。
答案 0 :(得分:3)
可能有一个更好看的解决方案,但你可以使用
CONCAT(
IF(CHS = 0, '', 'CHS'),
IF(CHS != 0 AND ACC != 0, ', ', ''),
IF(ACC = 0, '', 'ACC')
)
您还可以使用REPLACE
删除“空白:”
REPLACE(CONCAT_WS(', ',
IF(CHS = 0, 'REMOVEIT', 'CHS'),
IF(ACC = 0, 'REMOVEIT', 'ACC')
), 'REMOVEIT, ', '')
答案 1 :(得分:2)
您可以结合CASE使用CONCAT_WS,跳过NULL值:
SELECT
id,
CONCAT_WS(', ',
CASE WHEN CHS THEN 'CHS' END,
CASE WHEN ACC THEN 'ACC' END
) as origin
FROM
origin;
当条件为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;
请使用两种解决方案here查看小提琴。
答案 2 :(得分:1)
试试这个。
SELECT
TRIM(TRAILING ', ' FROM CONCAT_WS(', ',
IF(CHS = 0, '', 'CHS'),
IF(ACC = 0, '', 'ACC')
)) as origin
FROM
origin;
这是mysql文档。
http://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_trim