차근차근/Oracle

REGEXP_SUBSTR , LEVEL, CONNECT BY, INSTR

예쁜꽃이피었으면 2022. 4. 13. 14:37
REGEXP_SUBSTR

- Oracle 10g부터 나온 기능

- REGEXP_SUBSTR(대상 문자, 패턴, 시작위치, 매칭순번)

- 예)

REGEXP_SUBSTR('A,01,02_03','[^,]+',1,1) -> A

REGEXP_SUBSTR('A,01,02_03','[^,]+',1,2) -> 01

REGEXP_SUBSTR('A,01,02_03','[^,]+',1,3) -> 02

REGEXP_SUBSTR('A,01,02_03','[^,]+',1,4) -> 

- 패턴에서 (SQL 표준 정규 표현식을 사용하기 때문에 필요한 것들은 찾아서 만들어야 한다.)

https://developer-ek.tistory.com/38

^ : 문자열의 시작

[^] : 대괄호 안에 있기 때문에 not표현이 된다.

+ : 1회 또는 그 이상의 횟수로 일치

=> 예제 있는 패턴 [^,]+ 은 ,로 시작하지 않는 것으로 반복해서 잘라라..이런 뜻이라는데 이말은 도통 이해가 되지 않는다.. 이해하기 쉽게 생각하자면 ,를 구분자로 문자를 잘라라..정도로 이해했다.

 

https://docs.aws.amazon.com/ko_kr/redshift/latest/dg/REGEXP_SUBSTR.html

https://good4uprin.tistory.com/11

https://www.haguangho.com/88

https://jack-of-all-trades.tistory.com/386

 

 

LEVEL , CONNENCT BY

- CONNECT BY LEVEL쿼리는 계층형 쿼리로 오라클에서 값을 연속적으로 증가하는 값이 필요할 때 사용한다.

- for문과 비슷한데..

SELECT LEVEL

FROM DUAL

CONNECT BY LEVEL < 10; 하면 1~9까지의 데이터가 생긴다.

- LEVEL데이터를 가지고 연산을 통해 필요한 데이터를 만들 수도 있을 것 같다.

- LEVEL : 오라클에서 실행되는 모든 쿼리 내에서 사용한 가상의 열이다. 트리 내에서 어떤 LEVEL에 있는지를 나타내는 정수값이다. 

- CONNECT BY절 : 연결 고리를 가지고 목록을 가져온다.

각 행이 어떻게 연결되는지 오라클에게 알려주는 역할을 한다. 계층 구조 내에서 각 행의 관계를 설정하는 것이다. => 이게 잘 이해가 안감..

 

https://tiboy.tistory.com/563

https://loveuceci.tistory.com/1226

https://vaert.tistory.com/166

 

 

 

 INSTR

INSTR(문자열, 찾을 문자값, 찾기 시작할 위치,  찾은결과의 순번)

- INSTR함수는 찾는 문자의 위치(찾는 단어 앞글자의 인덱스)를 반환한다.

- 찾는 문자가 없으면 0을 반황

-  찾기 시작할 위치가 양수이면 왼->오 / 찾기 시작할 위치가 음수이면 오 -> 왼 방향으로 진행된다.

 

https://rimkongs.tistory.com/172

 


SELECT             REGEXP_SUBSTR('가,나,다' , '[^,]+'  , 1 , LEVEL) TESTTEXT

FROM              DUAL

CONNECT BY     INSTR('가,나,다' , ',' , 1 , LEVEL -1) > 0 ;

 

이라는 쿼리가 있다면 실행했을 때

TESTTEXT

 

로 출력된다. 

 

- CONNECT BY절에서 > 0 부분이 계속 궁금했는데 >= , < , = 등..연산자가 꼭 필요한 것 같다. 

- 근데 계속 이해가 안가는게 레벨은 1,2,3이고.. INSTR에 레벨-1하면 0이 나오는데.. 0보다 크다는 조건이 어떻게 성립이 되는지 모르겠고... LEVEL-1이 부분이 찾은 문자열이 여러개일 경우에 몇번째 문자열인지 적는 부분이라는데.. 0번째 문자열은 뭐지.. 이해가 안감..

 

+ 팀장님께 질문드렸는데

- CONNECT BY는 대체로 관리가 어렵고 속도도 느리기 때문에 잘 쓰이질 않는다고 한다.

- 오라클 11g 이상에서는 select를 서브 쿼리로 한 단계씩 불러오도록 만드는 것이 더 낫다.

 

 

 

 

 

 

 

 

 

 

반응형

'차근차근 > Oracle' 카테고리의 다른 글

[Oracle] FETCH 구문 사용하기  (0) 2022.06.03
tnsnames.ora파일  (0) 2022.05.19
NEXTVAL , CURRVAL  (0) 2022.03.31
Oracle count(*) count(1) count(컬럼명)  (0) 2022.03.28
ROWID  (0) 2022.03.25