我有一个查询,像这样:的Oracle SQL逗号分隔的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
这给了我一个表,看起来像:
id strain_name
----------------------------------------------
100 CD-1
101 CD-1
102 CD-1
200 SCID
300 BusIp-hy
301 BusIp-hy
... ...
现在由我strain_name
想组结果表并获得逗号分隔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
能否请你帮我纠正过去的查询,这样我可以得到id
的每个strain_name
一个逗号分隔的列表?
感谢,这对我的作品。只是想知道为什么你必须将'ORDER BY'从'strain_name'改为'id'? –
@PatrickGregorio从您的预期结果看来,您希望以升序排列以逗号分隔的ID。 'LISTAGG'的'ORDER BY'在组内,因此所有的项目都有相同的'strain_name'(因为这是group by子句) - 使用这个顺序会导致[非确定性排序] (http://stackoverflow.com/q/35747417/1509264),但“id”值看起来都不一样,因此会导致确定性排序。 – MT0