잡동사니

반응형

질문

여러 열 (많은 열과 행이 있음)을 새로운 하나의 열로 병합해야합니다.

예 : 단축 된 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ł


답변1

일부 조건부 논리와 함께 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)
           )


답변2

다음과 같이 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;
/


답변3

@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));


 

 

 

 

출처 : https://stackoverflow.com/questions/62066026/oracle-sql-how-to-merge-multiple-columns-into-new-one

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band