복붙노트

[SQL] 오라클에서 SQL 쿼리에서 연결할 결과

SQL

오라클에서 SQL 쿼리에서 연결할 결과

나는 테이블에 같은 데이터가

NAME PRICE
A    2
B    3
C    5
D    9
E    5

나는 1 행의 모든 ​​값을 표시 할; 예를 들면 :

A,2|B,3|C,5|D,9|E,5|

어떻게 나에게 오라클이 같은 문자열을 줄 것이다 쿼리를 만드는 방법에 대한 갈 것이라고? 나는 무언가로 프로그래밍 할 필요가 없습니다 난 그냥 방법은 내가 이상 복사하여 워드 문서에 붙여 넣을 수 있도록 결과에 표시하는 그 라인을 싶어.

내 오라클 버전은 10.2.0.5입니다.

해결법

  1. ==============================

    1.- 오라클 10g -

    - 오라클 10g -

    SELECT deptno, WM_CONCAT(ename) AS employees
      FROM   scott.emp
    GROUP BY deptno;
    
    Output:
         10  CLARK,MILLER,KING
         20  SMITH,FORD,ADAMS,SCOTT,JONES
         30  ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD
    
  2. ==============================

    2.나는이 조금 늦게 알고 있지만,이 시도 :

    나는이 조금 늦게 알고 있지만,이 시도 :

    SELECT LISTAGG(CONCAT(CONCAT(NAME,','),PRICE),'|') WITHIN GROUP (ORDER BY NAME) AS CONCATDATA
    FROM your_table
    
  3. ==============================

    3.내가 빨리 그런 뭔가가 필요하고 내가 PL / SQL을 사용하지 않고 SQL에 있고 싶어 보통 때, 나는 아래의 해킹과 유사한 것을 사용 :

    내가 빨리 그런 뭔가가 필요하고 내가 PL / SQL을 사용하지 않고 SQL에 있고 싶어 보통 때, 나는 아래의 해킹과 유사한 것을 사용 :

    select sys_connect_by_path(col, ', ') as concat
    from
    (
      select 'E' as col, 1 as seq from dual
      union
      select 'F', 2 from dual
      union
      select 'G', 3 from dual
    )
    where seq = 3
    start with seq = 1
    connect by prior seq+1 = seq
    

    그것은 아이에게 부모에서 "경로"를 얻기 위해 설계되었습니다 "sys_connect_by_path"특수 기능을 사용하는 계층 적 쿼리입니다.

    우리가 서열 = 1 레코드가 서열과 레코드의 부모 인 것을 시뮬레이션되는 일을 = 2 등 네 번째, 그리고 마지막 자식의 전체 경로지고 (이 경우, 서열 = 3 기록)하는 효과적으로 "COL"열 모두의 연결이 될 것이다

    귀하의 경우에 적응 :

    select sys_connect_by_path(to_clob(col), '|') as concat
    from
    (
      select name || ',' || price as col, rownum as seq, max(rownum) over (partition by 1) as max_seq
      from
      (
       /* Simulating your table */
        select 'A' as name, 2 as price from dual
        union
        select 'B' as name, 3 as price from dual
        union
        select 'C' as name, 5 as price from dual
        union
        select 'D' as name, 9 as price from dual
        union
        select 'E' as name, 5 as price from dual
      )
    )
    where seq = max_seq
    start with seq = 1
    connect by prior seq+1 = seq
    

    결과는 다음 | A, 2 | B, (3) | C 5 | D, 9 | E 5

  4. ==============================

    4.당신이 오라클에있어 당신이 우수한 listagg을 사용할 수 없습니다 10G (). 그러나, 수많은 다른 문자열 집계 방법이 있습니다.

    당신이 오라클에있어 당신이 우수한 listagg을 사용할 수 없습니다 10G (). 그러나, 수많은 다른 문자열 집계 방법이 있습니다.

    모든 복잡한 것들에 대한 특별한 필요가 없습니다. 다음 표를 가정

    create table a ( NAME varchar2(1), PRICE number);
    insert all
    into a values ('A',    2)
    into a values ('B',    3)
    into a values ('C',    5)
    into a values ('D',    9)
    into a values ('E',    5)
    select * from dual
    

    지원되지 않는 기능 wm_concat 충분합니다 :

    select replace(replace(wm_concat (name || '#' || price), ',', '|'), '#', ',')
      from a;
    
    REPLACE(REPLACE(WM_CONCAT(NAME||'#'||PRICE),',','|'),'#',',')
    --------------------------------------------------------------------------------
    A,2|B,3|C,5|D,9|E,5
    

    그러나, 당신은 또한 대체 기능없이 그것을 할, 또한 위의 링크에, 톰 카이트의 stragg을 변경할 수 있습니다.

  5. ==============================

    5.여기에 또 다른 접근 방법은 모델 절을 사용한다 :

    여기에 또 다른 접근 방법은 모델 절을 사용한다 :

    -- sample of data from your question
    with t1(NAME1, PRICE) as(
       select 'A',    2 from dual union all
       select 'B',    3 from dual union all
       select 'C',    5 from dual union all
       select 'D',    9 from dual union all
       select 'E',    5 from dual
    ) -- the query
     select Res
      from (select name1
                 , price
                 , rn
                 , res
             from t1
             model
             dimension by (row_number() over(order by name1) rn)
             measures (name1, price, cast(null as varchar2(101)) as res)
             (res[rn] order by rn desc = name1[cv()] || ',' || price[cv()] || '|' ||  res[cv() + 1])
           )
    where rn = 1  
    

    결과:

    RES
    ----------------------
    A,2|B,3|C,5|D,9|E,5| 
    

    SQLFiddle 예

  6. ==============================

    6.SQL 바이올린에서 사용하는 오라클 11G : 여기 XMLAGG를 사용까지 얻을 수 있었다.

    SQL 바이올린에서 사용하는 오라클 11G : 여기 XMLAGG를 사용까지 얻을 수 있었다.

    데이터 테이블 :

    COL1    COL2    COL3
    1       0       0
    1       1       1
    2       0       0
    3       0       0
    3       1       0
    
    
    SELECT
        RTRIM(REPLACE(REPLACE(
          XMLAgg(XMLElement("x", col1,',', col2, col3)
    
    ORDER BY col1), '<x>'), '</x>', '|')) AS COLS
      FROM ab
    ;
    

    결과 :

    COLS
    1,00| 3,00| 2,00| 1,11| 3,10|
    
  7. ==============================

    7.심하게 비효율적이고 안된 다음과 같은 뭔가.

    심하게 비효율적이고 안된 다음과 같은 뭔가.

        create function foo returning varchar2  as  
        (    
            declare bar varchar2(8000) --arbitrary number
            CURSOR cur IS
            SELECT name,price  
            from my_table  
            LOOP
    
        FETCH cur INTO r;
    
        EXIT WHEN cur%NOTFOUND;
    
           bar:= r.name|| ',' ||r.price || '|'
    
      END LOOP;  
      dbms_output.put_line(bar);
           return bar
        )  
    
  8. from https://stackoverflow.com/questions/14243131/concatenate-results-from-a-sql-query-in-oracle by cc-by-sa and MIT license