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_name
的 id
的逗号分隔列表吗?
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
我有这样的查询:
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_name
的 id
的逗号分隔列表吗?
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