Oracle SQL 逗号分隔的 id

Oracle SQL comma-separated id

我有这样的查询:

SELECT
  s.id,
  CASE
    WHEN INSTR(s.strain_value, '[') = 0
    THEN s.strain_name
    ELSE TRIM(SUBSTR(s.strain_name, 1, INSTR(s.strain_name, '[')-1))
  END AS strain_name
FROM strain s

这给了我一个 table 看起来像:

id      strain_name
----------------------------------------------
100     CD-1
101     CD-1
102     CD-1
200     SCID
300     BusIp-hy
301     BusIp-hy
...     ...

现在我想用 strain_name 对结果 table 进行分组,并得到逗号分隔的 id,如下所示:

id              strain_name
----------------------------------------------
100, 101, 102   CD-1
200             SCID
300, 301        BusIp-hy
...             ...

我尝试了这个查询,但没有得到我想要的结果:

WITH q AS (
  SELECT
    s.id,
    CASE
      WHEN INSTR(s.strain_name, '[') = 0
      THEN s.strain_name
      ELSE TRIM(SUBSTR(s.strain_name, 1, INSTR(s.strain_name, '[')-1))
    END AS strain_name
  FROM strain s
)
SELECT (
  SELECT LISTAGG(id, ', ')
  WITHIN GROUP (
    ORDER BY strain_name ASC
  )
  FROM (SELECT DISTINCT strain_name FROM q) dc
) AS id, strain_name
FROM q

你能帮我更正最后一个查询,这样我就可以得到每个 strain_nameid 的逗号分隔列表吗?

WITH q ( id, strain_name ) AS (
  SELECT id,
         CASE WHEN INSTR(strain_value, '[') = 0
              THEN strain_name
              ELSE TRIM(SUBSTR(strain_name, 1, INSTR(strain_name, '[')-1))
         END
  FROM strain
)
SELECT LISTAGG( id, ', ' ) WITHIN GROUP ( ORDER BY id ) AS id,
       strain_name
FROM   q
GROUP BY strain_name

你尝试过 GROUP BY 吗?

WITH q AS (
...
)
SELECT strain_name, listagg(id, ', ') within GROUP(ORDER BY id)
FROM   q
GROUP  BY strain_name
ORDER  BY strain_name
WITH q AS (
  SELECT
    s.id,
    CASE
      WHEN INSTR(s.strain_name, '[') = 0
      THEN s.strain_name
      ELSE TRIM(SUBSTR(s.strain_name, 1, INSTR(s.strain_name, '[')-1))
    END AS strain_name
  FROM strain s
)
SELECT LISTAGG(id, ', ')  WITHIN GROUP (ORDER BY id ASC) as id, q.strain_name
  FROM q
group by q.strain_name