Oracle
當列的字元之間沒有分隔符時,使用“正則表達式”來拆分列的字元時出現問題
我有一個具有以下結構的表:
create table TBL_TEST ( col_id NUMBER, col_name VARCHAR2(500) )
一些範例數據:
col_id | col_name ----------------- 1 | aetnap 2 | elppa 3 | ananab
我需要做的是每個
split characters
列,例如我們必須有:col_name``col_id``col_id=1
col_id | col_name ----------------- 1 | a 1 | e 1 | t 1 | n 1 | a 1 | p
當表中只有一條記錄時,此查詢很好:
SELECT col_id, REGEXP_SUBSTR(col_name, '[a-z]{1}', 1, LEVEL) AS VAL FROM tbl_test t CONNECT BY REGEXP_SUBSTR(col_name, '[a-z]{1}', 1, LEVEL) is not null
但是一旦我在表中插入另一條記錄(比如 col_id=2 和 col_id=3),我就無法得到想要的結果。我想知道兩件事:
- 為什麼此查詢對一條記錄有效,而對更多則無效?
- 當它們之間沒有分隔符(如,或。或*)時,分割字元的最佳方法是什麼?
提前致謝
1-因為有多行,存在多條路徑以達到層次結構中的一個級別
select lvl, count(*) from ( SELECT col_id, REGEXP_SUBSTR(col_name, '[a-z]{1}', 1, LEVEL) AS VAL, level lvl FROM tbl_test CONNECT BY REGEXP_SUBSTR(col_name, '[a-z]{1}', 1, LEVEL) is not null ) group by rollup(lvl) order by 1; LVL COUNT(*) ---------- ---------- 1 3 2 9 3 27 4 81 5 243 6 486 849
2-我並不是說它是最好的,它只是一種可能的方法(添加分隔符並使用其他技巧):
drop table tbl_test; create table tbl_test ( col_id number, col_name varchar2(500) ); insert into tbl_test values (1, 'aetnap'); insert into tbl_test values (2, 'elppa'); insert into tbl_test values (3, 'ananab'); commit; select col_id, trim(column_value) val from tbl_test, xmltable(trim(trailing ',' from regexp_replace(col_name, '(.)', '"\1",'))); COL_ID VAL ------ --- 1 a 1 e 1 t 1 n 1 a 1 p 2 e 2 l 2 p 2 p 2 a 3 a 3 n 3 a 3 n 3 a 3 b
在這裡,您可以找到多種標記字元串的方法:
https://lalitkumarb.wordpress.com/2015/03/04/split-comma-delimited-strings-in-a-table-in-oracle/