样本数据:
CREATE TABLE table_name ( id, list ) AS SELECT 1, 'a,b,c,d' FROM DUAL UNION ALL -- Multiple items in the list SELECT 2, 'e' FROM DUAL UNION ALL -- Single item in the list SELECT 3, NULL FROM DUAL UNION ALL -- NULL list SELECT 4, 'f,,g' FROM DUAL; -- NULL item in the list
查询:
WITH bounds ( id, list, start_pos, end_pos, lvl ) AS ( SELECT id, list, 1, INSTR( list, ',' ), 1 FROM table_name UNION ALL SELECT id, list, end_pos + 1, INSTR( list, ',', end_pos + 1 ), lvl + 1 FROM bounds WHERE end_pos > 0 ) SELECT id, SUBSTR( list, start_pos, CASE end_pos WHEN 0 THEN LENGTH( list ) + 1 ELSE end_pos END - start_pos ) AS item, lvl FROM bounds ORDER BY id, lvl;
输出:
ID ITEM LVL ---------- ------- ---------- 1 a 1 1 b 2 1 c 3 1 d 4 2 e 1 3 (NULL) 1 4 f 1 4 (NULL) 2 4 g 3