Oracle에서 SQL 쿼리의 결과 연결
표에 이와 같은 데이터가 있습니다.
NAME PRICE
A 2
B 3
C 5
D 9
E 5
모든 값을 한 행에 표시하려고 합니다. 예를 들어 다음과 같습니다.
A,2|B,3|C,5|D,9|E,5|
오라클에서 이와 같은 문자열을 제공하는 쿼리를 만들려면 어떻게 해야 합니까?어떤 것으로 프로그래밍할 필요는 없습니다. 해당 줄이 결과에 나타나도록 하여 복사한 후 워드 문서에 붙여넣을 수 있도록 하는 방법만 있으면 됩니다.
Oracle 버전은 10.2.0.5입니다.
조금 늦었다는 것은 알지만 이것을 시도해 보십시오.
SELECT LISTAGG(CONCAT(CONCAT(NAME,','),PRICE),'|') WITHIN GROUP (ORDER BY NAME) AS CONCATDATA
FROM your_table
오라클 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
일반적으로 이러한 것이 빨리 필요하고 PL/SQL을 사용하지 않고 SQL을 유지하고 싶을 때 아래의 hack과 유사한 것을 사용합니다.
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" 특수 함수를 사용하는 계층형 쿼리입니다.
우리가 하고 있는 것은 seq=1을 가진 레코드가 seq=2를 가진 레코드의 부모이고, 그 다음 마지막 자식의 전체 경로(이 경우 seq=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
오라클 10g에서는 우수한 제품을 사용할 수 없습니다.listagg()
그러나 다른 수많은 문자열 집계 기법이 있습니다.
모든 복잡한 것들이 특별히 필요한 것은 아닙니다.다음 표를 가정합니다.
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
하지만, 당신은 또한 Tom Kyte의 것을 바꿀 수 있습니다.stragg
또한 위 링크에서, 교체 기능을 사용하지 않고 수행할 수 있습니다.
다음은 다음과 같은 다른 접근 방식입니다.model
절:
-- 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|
다음과 같은 것입니다. 매우 비효율적이고 검증되지 않았습니다.
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
)
xmlagg: sql fiddle에서 오라클 11G를 사용하여 여기까지 도달할 수 있었습니다.
데이터 표:
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|
SQLFiddle 데모
언급URL : https://stackoverflow.com/questions/14243131/concatenate-results-from-a-sql-query-in-oracle
'itsource' 카테고리의 다른 글
열에 고유한 것을 사용하고 다른 열에 대해 순서를 지정하면 오류가 발생합니다. (0) | 2023.07.01 |
---|---|
봄 부팅 애플리케이션을 위해 commandLine에서 application.properties를 전달하는 방법은 무엇입니까? (0) | 2023.07.01 |
Linkq는 먼저 특정 번호로 주문한 다음 모든 나머지 순서를 순서대로 표시합니다. (0) | 2023.07.01 |
오라클 피벗 쿼리는 열 이름 주위에 따옴표가 있는 열을 제공합니다.뭐라고? (0) | 2023.07.01 |
SQL Server에서 OPTION(MAXDOP 1)을 사용하는 목적은 무엇입니까? (0) | 2023.07.01 |