mysql 문의 드립니다. 0 8 1,635

by 김현민 [SQL Query] sql mysql [2018.06.26 08:52:16]


mysql 문의 드립니다.

기준테이블은 아래 t1 테이블의 데이터 구조를 가지고 있습니다.
구하고 싶은 결과값은 중복되는 값을 제거하고 cd값의 리스트 또는 count를 구하고 싶습니다.
cd값은 구분자를 사용하여 동적으로 여러개 입력될수 있습니다.
sql을 어떻게 작성 해야 할까요?ㅠㅠ


- 기준테이블
 select *
 from
  (
  select '111|112' as cd union all
  select '111' as cd union all
  select '115' as cd union all
  select '112|115|117|118|211|212' as cd union all
  select '111|210' as cd union all
  select '211' as cd union all
  select '212' as cd
  ) t1


- 결과값
 1) cd값의 리스트
  111
  112
  115
  117
  118
  210
  211
  212

 또는
 
 2) 리스트의 count값
  8row

 

감사합니당...

by 마농 [2018.06.26 09:25:40]
SELECT DISTINCT
       SUBSTRING_INDEX(SUBSTRING_INDEX(cd, '|', lv), '|', -1) cd
  FROM (SELECT '111|112' cd
        UNION ALL SELECT '111'
        UNION ALL SELECT '115'
        UNION ALL SELECT '112|115|117|118|211|212'
        UNION ALL SELECT '111|210'
        UNION ALL SELECT '211'
        UNION ALL SELECT '212'
        ) t1
 INNER JOIN
       (SELECT 1 lv
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9
        ) copy_t
    ON lv <= LENGTH(cd) - LENGTH(REPLACE(cd, '|', '')) + 1
 ORDER BY cd
;

 


by 우리집아찌 [2018.06.26 09:32:38]

MY-SQL 은 행복제가 없나보네요.. ㅡㅡ;


by 김현민 [2018.06.26 09:34:41]

답변 정말 감사합니다. 좋은 하루 되세요~~^^


by 아발란체 [2018.06.26 09:34:23]

전 REGEXP_SUBSTR로 풀다 포기.. MySQL는 인자 값에 position 정보가 있어 깔끔한데.. MariaDB가 먹통이네요.


by 마농 [2018.06.26 09:37:35]
MySQL 8.0 / MariaDB 10.2 에서는 이제 안되는게 없네요.
1. WITH 도 되고
2. 분석함수도 되고
3. Recursive 도 되네요.

-- 아래 쿼리는 MariaDB 10.2 에서 수행했습니다.
WITH RECURSIVE copy_t AS
(
SELECT 1 lv
 UNION ALL
SELECT lv + 1
  FROM copy_t
 WHERE lv <= 9
)
, t1 AS
(
SELECT '111|112' cd
UNION ALL SELECT '111'
UNION ALL SELECT '115'
UNION ALL SELECT '112|115|117|118|211|212'
UNION ALL SELECT '111|210'
UNION ALL SELECT '211'
UNION ALL SELECT '212'
)
SELECT DISTINCT
       SUBSTRING_INDEX(SUBSTRING_INDEX(cd, '|', lv), '|', -1) cd
  FROM t1
 INNER JOIN copy_t
    ON lv <= LENGTH(cd) - LENGTH(REPLACE(cd, '|', '')) + 1
 ORDER BY cd
;

 


by 아발란체 [2018.06.26 11:52:02]

RECURSIVE... 드뎌~~ !!


by 아발란체 [2018.06.26 11:53:03]

근데... 정말 오라클 공부하다 MySQL 하면.. 힌트 기반으로 스터디하면 버그가 너무 많은 것 같습니다. OTL


by 우리집아찌 [2018.06.26 12:41:02]

마리아DB 처음 써보는데

SEQUENCE도 지원된다네요.

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