이 경우 PL/SQL이 필요하지 않지만 단일 MERGE 문에서 수행 할 수 있습니다.
이
WITH your_table AS (SELECT 1 id, 'xxx;yyy;zzz;123456;' column1, NULL column2 FROM dual UNION ALL
SELECT 2 id, 'aaa' column1, NULL column2 FROM dual UNION ALL
SELECT 3 id, 'bbb' column1, NULL column2 FROM dual UNION ALL
SELECT 4 id, 'ccc' column1, NULL column2 FROM dual UNION ALL
SELECT 5 id, 'ddd' column1, NULL column2 FROM dual UNION ALL
SELECT 6 id, 'eee' column1, NULL column2 FROM dual UNION ALL
SELECT 7 id, 'xxx;yyy;zzz;789123;' column1, NULL column2 FROM dual UNION ALL
SELECT 8 id, 'aaa' column1, NULL column2 FROM dual)
select id,
column1,
last_value(CASE WHEN substr(column1, -1) = ';' THEN
regexp_substr(column1, ';*([[:digit:]]*)(;$)', 1, 1, NULL, 1)
END IGNORE NULLS) OVER (ORDER BY ID) column2
from your_table;
ID COLUMN1 COLUMN2
---------- ------------------- -------------------
1 xxx;yyy;zzz;123456; 123456
2 aaa 123456
3 bbb 123456
4 ccc 123456
5 ddd 123456
6 eee 123456
7 xxx;yyy;zzz;789123; 789123
8 aaa 789123
그런 다음에 그것을 사용할 수 있습니다 : 당신이 그렇게처럼 'LAST_VALUE() 분석 함수를 사용하여이 작업을 수행 할 수 있습니다 -
첫째로, 당신은 뒤에있는 결과를 얻는 방법 운동 소위 같이 업데이트를 할 MERGE 문 : 당신이 값이 CSV 값이있는 컬럼 1 행의 2 열을 업데이트하지 않는 경우
MERGE INTO your_table tgt
USING (select id,
column1,
CASE WHEN substr(column1, -1) = ';' THEN 'Y' ELSE 'N' END driving_column1,
last_value(CASE WHEN substr(column1, -1) = ';' THEN
regexp_substr(column1, ';*([[:digit:]]*)(;$)', 1, 1, NULL, 1)
END IGNORE NULLS) OVER (ORDER BY ID) column2 -- assuming id drives the correct order to use here
from your_table) src
ON (tgt.id = src.id) -- assuming id is the primary key of your_table
WHEN MATCHED THEN
UPDATE SET tgt.column2 = src.column2;
는 (I 현재 세미콜론이있을 것으로 가정 한 값이 csv 값인 경우) and driving_column1 = 'N'
을 포함하도록 ON 절을 업데이트하거나 driving_column1을 필터링하는 외부 쿼리에 원본 하위 쿼리를 래핑 할 수 있습니다 (불행히도 같은 쿼리 내에서 분석 함수를 필터링 할 수 없음). 또는 merge 문의 업데이트 섹션에 where 절을 추가 할 수 있습니다.
몇 가지 빠른 쿼리. 행은 항상 6 개 그룹으로되어 있으며, 또는 가변적 일 수 있으며 첫 번째 행은 항상 같은 길이입니까? – MightyRearranger
행이 24 행에서부터 더 다양 할 수는 없습니다. 첫 번째 줄은 항상 길이가 같고 처음 세 줄은 동일합니다. – snow