Oracle

當列的字元之間沒有分隔符時,使用“正則表達式”來拆分列的字元時出現問題

  • August 24, 2020

我有一個具有以下結構的表:

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. 為什麼此查詢對一條記錄有效,而對更多則無效?
  2. 當它們之間沒有分隔符(如,或。或*)時,分割字元的最佳方法是什麼?

提前致謝

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/

引用自:https://dba.stackexchange.com/questions/274239