반응형
listunagg 함수?
오라클에 listunagg 함수 같은 것이 있습니까?예를 들어, 다음과 같은 데이터가 있는 경우:
user_id | degree_fi | 도_en | 정도_ |
---|---|---|---|
3601464 | 3700 | 1600 | 2200 |
1020 | 100 | 0 | 0 |
3600520 | 100,3200,400 | 1300, 800, 3000 | 1400, 600, 1500 |
3600882 | 0 | 100 | 200 |
그리고 다음과 같은 데이터를 보여주고 싶습니다.
user_id | degree_fi | 도_en | 정도_ |
---|---|---|---|
3601464 | 3700 | 1600 | 2200 |
1020 | 100 | 0 | 0 |
3600520 | 100 | 1300 | 1400 |
3600882 | 0 | 100 | 200 |
3600520 | 3200 | 800 | 600 |
3600520 | 400 | 3000 | 1500 |
나는 반대의 기능을 찾으려고 했습니다.listagg
아무것도 찾을 수 없었습니다.
@be here에서 이미 언급했듯이 Oracle은 그러한 기능을 제공하지 않습니다.따라서 빠른 해결 방법으로 유사한 쿼리를 작성할 수 있습니다.
with t1(user_id, degree_fi, degree_en, degree_sv) as
(
select 3601464, '3700', '1600', '2200' from dual union all
select 1020 , '100' , '0' , '0' from dual union all
select 3600520, '100,3200,400', '1300, 800, 3000', '1400, 600, 1500' from dual union all
select 3600882, '0', '100', '200' from dual
),
Occurence(ocr) as(
select Level as ocr
from (select max(greatest(regexp_count(degree_fi, '[^,]+')
, regexp_count(degree_en, '[^,]+')
, regexp_count(degree_sv, '[^,]+')
)
) mx
from t1
)
connect by level <= mx
)
select *
from (
select User_id
, regexp_substr(degree_fi, '[^,]+', 1, o.ocr) as degree_fi
, regexp_substr(degree_en, '[^,]+', 1, o.ocr) as degree_en
, regexp_substr(degree_sv, '[^,]+', 1, o.ocr) as degree_sv
from t1 t
cross join Occurence o
)
where degree_fi is not null
or degree_en is not null
or degree_sv is not null
결과:
User_Id Degree_Fi Degree_En Degree_Sv
------------------------------------------------------------
3601464 3700 1600 2200
1020 100 0 0
3600520 100 1300 1400
3600882 0 100 200
3600520 3200 800 600
3600520 400 3000 1500
Ora OpenSource Utils 패키지 세트에서 제공하는 기능이 있습니다.효과도 좋습니다.
목록을 취소하려면 Tom이 Oracle의 "탐에게 묻다"에서 하는 말을 고려하십시오. https://blogs.oracle.com/oraclemagazine/on-cursors-sql-and-analytics 코드 목록 3 또는 4를 참조하십시오.
톰이 언급하지 않는 제가 선호하는 옵션은 짧은 문자열(<34자)에 적합합니다.Oracle DBMS_UTILITY.coma_to_table 기능을 사용합니다.예:
SET SERVEROUTPUT ON
DECLARE
/** test data **/
L_LIST1 VARCHAR2(500) := '"A","B","C","Pierre - Andre","D","E","OFVampFVapos;CBryan","F","G","H","I","J"';
l_list2 VARCHAR2(500);
l_tablen BINARY_INTEGER;
l_tab DBMS_UTILITY.uncl_array;
BEGIN
DBMS_OUTPUT.put_line('l_list1 : ' || l_list1);
DBMS_UTILITY.comma_to_table (
list => l_list1,
tablen => l_tablen,
tab => l_tab);
FOR i IN 1 .. l_tablen LOOP
DBMS_OUTPUT.put_line(i || ' : ' || l_tab(i));
END LOOP;
DBMS_UTILITY.table_to_comma (
tab => l_tab,
tablen => l_tablen,
list => l_list2);
DBMS_OUTPUT.put_line('l_list2 : ' || l_list2);
end;
언급URL : https://stackoverflow.com/questions/13189575/listunagg-function
반응형
'programing' 카테고리의 다른 글
실제 영상을 다운로드하는 동안 로딩 영상을 표시하는 방법 (0) | 2023.10.12 |
---|---|
자바스크립트로 텍스트 선택 지우기 (0) | 2023.10.07 |
XML에서 문자열 이름에 공백 문자를 넣는 방법은? (0) | 2023.10.07 |
Element ID에 포커스가 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.10.07 |
도커 이미지 필터 사용 방법 (0) | 2023.10.07 |