首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySql: Concat‘’ed值

MySql: Concat‘’ed值
EN

Stack Overflow用户
提问于 2013-04-04 18:35:54
回答 3查看 4.2K关注 0票数 5

试图找到一种方法,将CONCAT与IF结合起来--或者以其他方式在逗号分隔的列表中显示set标志的文本值。

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

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

代码语言:javascript
运行
复制
origin:
+--+-----+-----+
|# | CHS | ACC |
+--+-----+-----+
|1 | 0   | 1   |
|2 | 1   | 1   |
|3 | 1   | 0   |
|4 | 0   | 0   |
+--+-----+-----+

我要:

代码语言:javascript
运行
复制
+--+----------+
|# |  origin  |
+--+----------+
|1 | ACC      |
|2 | CHS, ACC |
|3 | CHS      |
|4 |          |
+--+----------+

不是(这个或类似的):

代码语言:javascript
运行
复制
+--+-----------+
|# | origin    |
+--+-----------+
|1 | ACC,      |
|2 | CHS, ACC, |
|3 | CHS,      |
|4 | ,         |
+--+-----------+

朝这个方向发展的东西:

代码语言:javascript
运行
复制
SELECT
    CONCAT_WS(', ',
        IF(CHS = 0, '', 'CHS'),
        IF(ACC = 0, '', 'ACC')
    ) as origin
FROM
    origin;

但空值之间没有逗号。

这最终适用于一个具有10列的表,我将其与基于id的其他表连接。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-04 18:59:44

您可以使用跳过空值的CONCAT_WS,并结合大小写:

代码语言:javascript
运行
复制
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,而不是“”。

如果有许多列,还可以使用以下内容创建动态查询:

代码语言:javascript
运行
复制
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;

请看小提琴,这两种解决方案,这里

票数 5
EN

Stack Overflow用户

发布于 2013-04-04 18:39:01

也许有一个更好看的解决方案,但您可以使用

代码语言:javascript
运行
复制
CONCAT(
    IF(CHS = 0, '', 'CHS'),
    IF(CHS != 0 AND ACC != 0, ', ', ''),
    IF(ACC = 0, '', 'ACC')
)

您还可以使用REPLACE删除“空格:”

代码语言:javascript
运行
复制
REPLACE(CONCAT_WS(', ',
    IF(CHS = 0, 'REMOVEIT', 'CHS'),
    IF(ACC = 0, 'REMOVEIT', 'ACC')
), 'REMOVEIT, ', '')
票数 3
EN

Stack Overflow用户

发布于 2013-04-04 19:10:57

尝尝这个。

代码语言:javascript
运行
复制
SELECT
    TRIM(TRAILING ', ' FROM CONCAT_WS(', ',
        IF(CHS = 0, '', 'CHS'),
        IF(ACC = 0, '', 'ACC')
    )) as origin
FROM
    origin;

这是mysql文档。

纵倾

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15819018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档