oracle -> mariadb 로 connect by 절 0 6 5,242

by 희주윤 [SQL Query] CONNECTBY ORACLE MYSQL MARIADB [2021.10.05 15:31:47]


안녕하세요 오라클 mariadb로 이전하게 되면서 쿼리 수정하는 중에 풀리지 않아 질문드립니다ㅠ 

SELECT 
TRIM(REGEXP_SUBSTR('A001,A002,A003','[^,]+',1,LEVEL)) AS DATA
FROM DUAL
CONNECT BY INSTR('A001,A002,A003',',',1,LEVEL-1)>0

해당 쿼리 조회시

DATA

-------

A001

A002

A003

이렇게 조회 되는데 mariadb로 어떻게 작성해야 될지 모르겠습니다....도와주세요ㅜㅠㅜ

 

by 마농 [2021.10.05 15:52:11]
-- MariaDB --
SELECT v
     , seq
     , SUBSTRING_INDEX(SUBSTRING_INDEX(v, ',', seq), ',', -1) x
  FROM (SELECT 'A001,A002,A003' v) a
 INNER JOIN seq_1_to_9 b
    ON seq <= LENGTH(v) - LENGTH(REPLACE(v, ',', '')) + 1
;

 


by 희주윤 [2021.10.05 16:00:32]

감사합니다 제가 질문드린 'A001,A002,A003' 이런 문자열의 갯수가 10개를 넘는 경우엔 seq_1_to_9 을 수정하는 방법 밖에 없는 듯 보여서요,, 혹시 다른 방법도 있을까요..??

 

'A001,A002,A003,admin,테스트1,A001001,A001002,A001003,A002001,A002002,A002003,A003001,A003002' 이런경우에도 성립할수 있도록이요..ㅠㅜ


by 마농 [2021.10.05 16:07:50]

seq_1_to_99  -- 최대 예상 수를 사용하시면 됩니다.


by 희주윤 [2021.10.05 16:10:06]

네 감사합니다~!


by 마농 [2021.10.05 16:18:13]
WITH RECURSIVE t AS
(
SELECT v
     , 1 lv
     , SUBSTRING_INDEX(v, ',', 1) x
     , SUBSTR(v, INSTR(v, ',') + 1) y
  FROM (SELECT CONCAT('A001,A002,A003', ',') v) a
 UNION ALL
SELECT v
     , lv + 1
     , SUBSTRING_INDEX(y, ',', 1) x
     , SUBSTR(y, INSTR(y, ',') + 1) y
  FROM t
 WHERE INSTR(y, ',') > 0
)
SELECT *
  FROM t
;
WITH RECURSIVE t AS
(
SELECT v
     , LENGTH(v) - LENGTH(REPLACE(v, ',', '')) + 1 cnt
     , 1 lv
     , SUBSTRING_INDEX(v, ',', 1) x
  FROM (SELECT 'A001,A002,A003' v) a
 UNION ALL
SELECT v
     , cnt
     , lv + 1
     , SUBSTRING_INDEX(SUBSTRING_INDEX(v, ',', lv + 1), ',', -1) x
  FROM t
 WHERE lv < cnt
)
SELECT *
  FROM t
;

Recursive 쿼리 참조.


by 희주윤 [2021.10.05 16:54:06]

와,,,, RECURSIVE 해보다가 안되서 질문드린거였는데 정말 감사합니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입