2016-08-23 96 views
0

我有一个查询,像这样:的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一个逗号分隔的列表?

回答

2
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 
+0

感谢,这对我的作品。只是想知道为什么你必须将'ORDER BY'从'strain_name'改为'id'? –

+1

@PatrickGregorio从您的预期结果看来,您希望以升序排列以逗号分隔的ID。 'LISTAGG'的'ORDER BY'在组内,因此所有的项目都有相同的'strain_name'(因为这是group by子句) - 使用这个顺序会导致[非确定性排序] (http://stackoverflow.com/q/35747417/1509264),但“id”值看起来都不一样,因此会导致确定性排序。 – MT0

2

您是否尝试过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 
2
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