여러 열 (많은 열과 행이 있음)을 새로운 하나의 열로 병합해야합니다.
예 : 단축 된 test_table
Col1 Col2 Col3 Col4 Col5 Col6
942 72987 14759 441277503 73553030 null
943 72987 14759 441278315 73553166 null
944 72987 14759 441362593 73570082 null
945 72987 14759 441380217 73572619 null
946 72987 14759 441394189 73574533 null
947 72987 14759 441394189 73574533 null
그리고 Col1-Col5를 쉼표 구분 기호 ( ",")와 병합하고 생성 된 문자열을 Col6에 넣고 싶습니다.
그래서 Col6에서 예를 들면 다음과 같습니다.942,72987,14759,441277503,73553030
SQL / PL / SQL에서 어떻게 할 수있는 솔루션이 있습니까?내가 말했듯이 컬럼이 많기 때문에 Col1을 사용하여 수동으로 추가하는 것을 피하고 싶습니다 || Col2 || Col3 || Col4 || Col5
미리 감사드립니다.Michał
일부 조건부 논리와 함께 trim ()
을 사용할 수 있습니다.
select trim(leading ',' from
(case when col1 is not null then ',' || col1 else '' end) ||
(case when col2 is not null then ',' || col2 else '' end) ||
(case when col3 is not null then ',' || col3 else '' end) ||
(case when col4 is not null then ',' || col4 else '' end) ||
(case when col5 is not null then ',' || col5 else '' end)
)
다음과 같이 PL / SQL 블록을 시도하십시오.
SET SERVEROUT ON
DECLARE
LV_COLUMNS VARCHAR2(20000);
BEGIN
SELECT LISTAGG('CASE WHEN ' || COLUMN_NAME || ' IS NOT NULL THEN ' || COLUMN_NAME || ' || '',''|| '
|| 'ELSE NULL END'
, '||') WITHIN GROUP(ORDER BY COLUMN_ID)
INTO LV_COLUMNS
FROM USER_TAB_COLS
WHERE TABLE_NAME = 'YOUR_TABLE_NAME'
AND COLUMN_NAME <> 'COL6'
AND HIDDEN_COLUMN = 'NO';
DBMS_OUTPUT.PUT_LINE('UPDATE YOUR_TABLE_NAME SET COL6 = TRIM('','' FROM (' || LV_COLUMNS || '))');
EXECUTE IMMEDIATE 'UPDATE YOUR_TABLE_NAME SET COL6 = TRIM('','' FROM (' || LV_COLUMNS || '))';
COMMIT;
END;
/
@APC의 경로를 따르고 USER_TAB_COLUMNS
쿼리를 사용하여 필요한 SQL을 생성합니다.
CREATE TABLE t (col1 VARCHAR2(5), col2 NUMBER, col3 VARCHAR2(30),
col4 VARCHAR2(7), col5 DATE, col6 VARCHAR2(200));
SELECT column_name
FROM user_tab_columns
WHERE table_name = 'T'
AND column_name <> 'COL6';
COL1
COL2
COL3
COL4
COL5
이제 LISTAGG :
SELECT LISTAGG(column_name, '||'',''||')
WITHIN GROUP (ORDER BY column_id) AS sql
FROM user_tab_columns
WHERE table_name = 'T'
AND column_name <> 'COL6';
COL1||','||COL2||','||COL3||','||COL4||','||COL5
이제이를 적절한 쿼리 f.i에 복사하여 붙여 넣습니다.
UPDATE t
SET col6 = COL1||','||COL2||','||COL3||','||COL4||','||COL5;
열을 연결하려면 VARCHAR2로 변환해야합니다. Oracle은 자동 데이터 유형 변환을 시도합니다. 이것이 효과가 있고 자신에게 충분한 지 확인해야합니다. 숫자에는 선행 공백, 쉼표 또는 소수점이있을 수 있으며 날짜에는 형식 문자열 등이 필요할 수 있습니다.
당신은 그 라인을 따라 그것을 생각할 수 있습니다.
SELECT column_name,
CASE WHEN data_type IN ('NUMBER','FLOAT')
THEN 'TO_CHAR('||column_name||')'
WHEN data_type IN ('DATE')
THEN 'TO_CHAR('||column_name||',''YYYY-MM-DD'')'
ELSE column_name
END AS cstr
FROM user_tab_columns
WHERE table_name = 'T'
AND column_name <> 'COL6';
COL1 COL1
COL2 TO_CHAR(COL2)
COL3 COL3
COL4 COL4
COL5 TO_CHAR(COL5,'YYYY-MM-DD')
상황에 따라 실제 데이터를 복사하는 대신 가상 열을 사용할 수 있습니다.
ALTER TABLE t DROP COLUMN col6;
ALTER TABLE t ADD (col6 NUMBER GENERATED ALWAYS
AS (COL1||','||COL2||','||COL3||','||COL4||','||COL5));