试图找到一种方法,将CONCAT与IF结合起来--或者以其他方式在逗号分隔的列表中显示set标志的文本值。
注意:这最终适用于带有10+列的表。这里用两个来简化。
假设我有一张挂着旗子的桌子。如果标志是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的其他表连接。
发布于 2013-04-04 18:59:44
您可以使用跳过空值的CONCAT_WS,并结合大小写:
SELECT
id,
CONCAT_WS(', ',
CASE WHEN CHS THEN 'CHS' END,
CASE WHEN ACC THEN 'ACC' END
) as origin
FROM
origin;当条件为FALSE时,由于我没有指定the子句,大小写将返回一个空值,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;请看小提琴,这两种解决方案,这里。
发布于 2013-04-04 18:39:01
也许有一个更好看的解决方案,但您可以使用
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, ', '')发布于 2013-04-04 19:10:57
尝尝这个。
SELECT
TRIM(TRAILING ', ' FROM CONCAT_WS(', ',
IF(CHS = 0, '', 'CHS'),
IF(ACC = 0, '', 'ACC')
)) as origin
FROM
origin;这是mysql文档。
纵倾
https://stackoverflow.com/questions/15819018
复制相似问题