programing

Oracle에서 varchar를 별도의 열로 분할

goodsources 2023. 6. 15. 21:48
반응형

Oracle에서 varchar를 별도의 열로 분할

나는 약간 곤경에 처해 있습니다.데이터베이스에서 특정 문자열로 시작하는 주석을 입력하고 그 결과를 별도의 열로 분리하라는 요청을 받았습니다.

예를 들어, 반환된 값이 다음과 같은 경우:

COLUMN_ONE
--------------------
'D7ERROR username'

반환은 다음과 같아야 합니다.

COL_ONE    COL_TWO
--------------------
D7ERROR   username   

문자열을 두 개로 분할하기 위해 결과 집합이 구성되면 열을 정의하는 것이 가능합니까?

데이터의 일관성에 따라 달라집니다. 단일 공백이 열 1과 열 2 사이의 구분 기호라고 가정합니다.

SELECT SUBSTR(t.column_one, 1, INSTR(t.column_one, ' ')-1) AS col_one,
       SUBSTR(t.column_one, INSTR(t.column_one, ' ')+1) AS col_two
  FROM YOUR_TABLE t

Oracle 10g+는 정규식을 지원하므로 해결해야 하는 상황에 따라 유연성을 높일 수 있습니다.정규식 하위 문자열 방법도 있습니다.

참조:

REGEXP_SUBSTR은 다음과 같이 간단합니다.

SELECT REGEXP_SUBSTR(t.column_one, '[^ ]+', 1, 1) col_one,
       REGEXP_SUBSTR(t.column_one, '[^ ]+', 1, 2) col_two
FROM YOUR_TABLE t;

간단한 방법은 열로 변환하는 것입니다.

SELECT COLUMN_VALUE FROM TABLE (SPLIT ('19869,19572,19223,18898,10155,'))

CREATE TYPE split_tbl as TABLE OF VARCHAR2(32767);

CREATE OR REPLACE FUNCTION split (p_list VARCHAR2, p_del VARCHAR2 := ',')
   RETURN split_tbl
   PIPELINED IS
   l_idx PLS_INTEGER;
   l_list VARCHAR2 (32767) := p_list;
   l_value VARCHAR2 (32767);
BEGIN
   LOOP
      l_idx := INSTR (l_list, p_del);

      IF l_idx > 0 THEN
         PIPE ROW (SUBSTR (l_list, 1, l_idx - 1));
         l_list := SUBSTR (l_list, l_idx + LENGTH (p_del));
      ELSE
         PIPE ROW (l_list);
         EXIT;
      END IF;
   END LOOP;

   RETURN;
END split;

언급URL : https://stackoverflow.com/questions/5199849/split-varchar-into-separate-columns-in-oracle

반응형