반응형

DB/Oracle 13

Split처럼 특정 구분자를 기준으로 열에서 행으로 변환 (Oracle)

오라클에서 위의 내용 처럼 한 컬럼에 특정 구분자(ex ',' , '/' 등등)로 구분하여 데이터를 관리하는 경우가 종종 있다. (개인적으론 테이블 설계가 잘못 되었다고 생각됨) 아래의 쿼리 형태로 행으로 구분해서 표현 가능 하다. SELECT T.ID ,REGEXP_SUBSTR(T.VALUE, '[^,]+', 1, Level) AS VALUE ,T.REG_DATE FROM ( SELECT 1 AS ID, '테스트1,테스트2,테스트3' AS VALUE, '2020-07-27 13:30:00' AS REG_DATE FROM DUAL UNION ALL SELECT 2 AS ID, '테스트4,테스트5' AS VALUE, '2020-07-27 14:40:00' AS REG_DATE FROM DUAL UNION ..

DB/Oracle 2020.07.27

CONNECT BY 뎁스구조 쿼리

트리구조, 뎁스구조에서 Full Path를 추출하는 쿼리를 오라클에서는 CONNECT BY를 사용하여 조회 할 수 있다. SELECT TC2.CD ,TC2.UP_CD ,TC2.CD_NM ,LTRIM (SYS_CONNECT_BY_PATH (TC2.CD_NM, '>'), '>') AS CD_NM_FULL FROM TB_CODE TC2 --START WITH TC2.CD = 'AB' START WITH TC2.CD IN('AA','AB','AC') CONNECT BY PRIOR TC2.CD = TC2.UP_CD 추가로, 고객사 요건으로 기존에 Full Path경로를 따로 담는 컬럼에 대해 추가 요청이 들어왔을때 기존에 등록되어 있는 데이터를 통해 Full Path값을 업데이트 해주는 쿼리는 아래와 같다. UP..

DB/Oracle 2020.02.14

Like검색할때 Text Index 생성시 유의사항

게시글 내용검색 등 blob, clob 타입의 like검색기능을 개발할때(검색엔진을 사용하지 않은경우), Text Index를 생성하여 해당 컬럼에 인뎅싱 작업을 할 수 있다. // CTXSYS 계정 해제 ALTER USER CTXSYS ACCOUNT UNLOCK ; // 권한 부여 GRANT CTXAPP TO DQDIC ; // 인덱스 생성 (parameter 데이터 변경 시 재적용 동기화 옵션) CREATE INDEX IDX_CONTAINS_DIC_SUBJECT ON DIC_SUBJECT(CONT) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('SYNC(ON COMMIT)'); SYNC(ON COMMIT) 파라미터를 통해 데이터가 변경 될때마다 바로 적용될 수 도 있지만 아..

DB/Oracle 2020.01.29

여러 행의 데이터를 하나의 컬럼데이터로 표현(LISTAGG,XMLAGG)

1) 문자열 조합 데이터 SIZE가 4000바이트 이하 일때 SELECT mtagWord.ID ,( SELECT LISTAGG(S1.SYNONYM_WORD, ',') WITHIN GROUP (ORDER BY S1.SYNONYM_WORD) FROM DS_MTAG_SYNONYM S1 WHERE S1.MTAG_WORD_ID = mtagWord.MTAG_WORD_ID ) AS SYNONYM_WORD FROM TEST mtagWord 2) 문자열 조합 데이터 SIZE가 4000바이트 이상 일때 (XML형태로 파싱 후 재작업) SELECT mtagWord.ID ,( SELECT RTRIM(XMLAGG(XMLELEMENT(S1,S1.SYNONYM_WORD||',') ORDER BY S1.SYNONYM_WORD).EX..

DB/Oracle 2020.01.29

ORA-01489: 문자열 연결의 결과가 너무 깁니다

data1과 data2가 VARCHAR2 타입인 다음과 같이 문자열 조합을 통해 쿼리 작성 시 하나의 결과라도 VARCHAR2 타입의 한계인 4000 문자를 초과 하게 되면 위의 에러 발생. select test1 || test2 from tb_test; * 해결 1) 기존의 컬럼 데이터대로 분리해서 애플리케이션에서 병합. select test1, test2 from tb_test; 2) CLOB 타입으로 변환해서 병합. (to_clob()은 CLOB 타입으로 변환해주는 함수.) select to_clob(test1) || to_clob(test2) from tb_test;

DB/Oracle 2020.01.03

ORA-01861: literal does not match format string (리터럴이 형식 문자열과 일치하지 않음)

ORA-01861: literal does not match format string (리터럴이 형식 문자열과 일치하지 않음) 개발자 로컬 환경에서는 정상적으로 실행되는 쿼리가 운영환경에 반영을 하면 이와 같은 에러가 발생되는 케이스가 종종 있다. 원인은 TO_DATE와 TO_CHAR의 함수에 날짜형식을 지정하지 않았을 때 기본값으로 지정되는 형식이 달라서 그렇다. TO_DATE('2020-01-01', 'YYYY-MM-DD') 이런식으로 쓰는데 두번째 인수인 'YYYY-MM-DD'를 생략해버리면 환경에 따라 서로 다른값이 지정되기 때문에 위와같은 ORA-01861 오류가 생기는 것이다. 물론 최선의 해결책은 TO_DATE와 TO_CHAR를 쓸 때에는 항상 데이터형식을 맞게 사용 하는 것 이다. 하지만 ..

DB/Oracle 2019.11.27
반응형