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
감사합니당...
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 ;
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 ;