MySql:Concat IF';教育价值观
试图找到一种方法将CONCAT与IF结合起来,或者以其他方式显示 逗号分隔列表中设置标志的文本值 注意:这最终适用于包含10+列的表。这里使用两个来简化 假设我有一张有旗帜的桌子。如果标志是MySql:Concat IF';教育价值观,mysql,Mysql,试图找到一种方法将CONCAT与IF结合起来,或者以其他方式显示 逗号分隔列表中设置标志的文本值 注意:这最终适用于包含10+列的表。这里使用两个来简化 假设我有一张有旗帜的桌子。如果标志是1我想显示一些文本值, 没有别的了 origin: +--+-----+-----+ |# | CHS | ACC | +--+-----+-----+ |1 | 0 | 1 | |2 | 1 | 1 | |3 | 1 | 0 | |4 | 0 | 0 | +--+-----+
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 | |
+--+----------+
不是(这个或类似的):
这方面的东西:
SELECT
CONCAT_WS(', ',
IF(CHS = 0, '', 'CHS'),
IF(ACC = 0, '', 'ACC')
) as origin
FROM
origin;
但空值之间不能使用逗号
这最终适用于一个包含10列的表,我将其与其他基于表的表连接起来
在id上。可能有一个外观更好的解决方案,但您可以使用
CONCAT(
IF(CHS = 0, '', 'CHS'),
IF(CHS != 0 AND ACC != 0, ', ', ''),
IF(ACC = 0, '', 'ACC')
)
您还可以使用REPLACE
删除“空格”:
您可以将跳过空值的CONCAT_WS与CASE结合使用:
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;
请参阅fiddle,使用这两种解决方案。试试这个
SELECT
TRIM(TRAILING ', ' FROM CONCAT_WS(', ',
IF(CHS = 0, '', 'CHS'),
IF(ACC = 0, '', 'ACC')
)) as origin
FROM
origin;
下面是mysql文档
是的。考虑到这一点,只有10列,它开始看起来非常难看;)谢谢不过我需要有多个REPLACE语句(或者找到另一种聪明的方法删除所有REMOVEIT语句),我正在查看它。太好了。这个很好用。使用
COLUMN\u NAME
会让它变得更好。谢谢。虽然这对3+列不太管用,但它是有价值的信息。如果架构在您的控制下,我建议您将列名作为值放在单独的表中,并使用源表中的外键引用来简化操作。这还允许您通过插入行而不是向原始表添加更多列来动态添加更多值。
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;
SELECT
TRIM(TRAILING ', ' FROM CONCAT_WS(', ',
IF(CHS = 0, '', 'CHS'),
IF(ACC = 0, '', 'ACC')
)) as origin
FROM
origin;