如何在mysql中使用concat_ws()中的distinct?

pobjuy32  于 2022-11-21  发布在  Mysql
关注(0)|答案(2)|浏览(198)

在 mySQL 中 , 我 有 一 个 表 :
| 标识 符|姓名|代码 1|代码 2|代码 3|
| - -| - -| - -| - -| - -|
| 一 个|吉姆|美国 汽车 协会|美国 汽车 协会|一 种|
| 2 个|赖恩|bb 型|bbb 型|最 佳|
| 三 个|泰德|C 语言|C 语言|抄送|
预期 输出 :
| 标识 符|姓名|串 接 代码|
| - -| - -| - -|
| 一 个|吉姆|aaa/年|
| 2 个|赖恩|bb/bb/b|
| 三 个|泰德|抄送|
我 试 了 一下 下面 的 查询 :

select
  id,
  name,
  concat_ws("/",NULLIF(code1,""),NULLIF(code2,""),NULLIF(code3,"")) as concat_code
from
  table1
group by id

中 的 每 一 个
但 它 给出 了 错误 的 输出 :
| 标识 符|姓名|串 接 代码|
| - -| - -| - -|
| 一 个|吉姆|aaa/aaa/a|
| 2 个|赖恩|bb/bb/b|
| 三 个|泰德|抄送|
如何 在 concat _ ws ( ) 中 使用 不同 的 组合 ?

thtygnil

thtygnil1#

这是一个示例,说明为什么具有列foo 1、foo 2等是糟糕的数据库设计;在一对多关系中应该有一个单独的表,它与原始表的每一行都有一个foo值。

select id, name, group_concat(distinct codes.code separator '/')
from table1
join (
    select id,NULLIF(code1,"") as code from table1
    union all
    select id,NULLIF(code2,"") from table1
    union all
    select id,NULLIF(code3,"") from table1
) codes using (id)
group by id

或者对code 2、code 3等使用卷积表达式,如果代码与concat_ws调用中前面的任何代码匹配,则该表达式返回null。

rqenqsqc

rqenqsqc2#

有点晚了,但对于其他人谷歌:尝试:

SELECT id, name, 
    CONCAT_WS("/",
        NULLIF(code1,""),
        CASE WHEN code2 NOT IN ('', code1) THEN code2 END, 
        CASE WHEN code3 NOT IN ('', code1, code2) THEN code3 END
    ) AS concat_code
FROM table1

CASE的作用相当于具有多个字符串值的NULLIF,其中一些是以前的值,以防止重复。
我省略了GROUP BY id,因为id似乎是主键,这使得该语句毫无用处。

相关问题