我正在使用正則運算式子字串來過濾掉開頭為“p”并在“-”之前結束的值。p 后跟 6 位數字。
我的代碼:
code,REGEXP_SUBSTR(CODE,'^[p][^-] ')
CODE |
REGEXP_SUBSTR(CODE,'^[P][^-] ') |
|---|---|
| p700401- | p700401 |
| p791701- | p791701 |
| 100-,p788001-, | 無效的 |
這是結果,但我正在努力處理像第三行這樣的案例。
100-,p788001-
有人可以指導我處理這種情況嗎
uj5u.com熱心網友回復:
如果要匹配逗號分隔字串中的完整術語,則可以使用:
SELECT code,
REGEXP_SUBSTR(code, '(^|,)(p\d{6})-(,|$)', 1, 1, NULL, 2) AS result
FROM table_name;
其中,對于樣本資料:
CREATE TABLE table_name (code) as
SELECT 'p700401-' FROM DUAL UNION ALL
SELECT 'p791701-' FROM DUAL UNION ALL
SELECT '100-,p788001-,' FROM DUAL UNION ALL
SELECT '123-,p456789-xyz,p987654-' FROM DUAL UNION ALL
SELECT 'p111111-,p222222-not_this,p333333-,p444444-' FROM DUAL;
輸出:
| 代碼 | 結果 |
|---|---|
| p700401- | p700401 |
| p791701- | p791701 |
| 100-,p788001-, | p788001 |
| 123-,p456789-xyz,p987654- | p987654 |
| p111111-,p222222-not_this,p333333-,p444444- | p111111 |
顯示多個術語
如果要從字串中洗掉不匹配的術語,則:
SELECT code,
LTRIM(
REGEXP_REPLACE(
',' || REPLACE(code, ',', ',,') || ',',
'((,p\d{6})-,)|,.*?,',
'\2'
),
','
) AS result
FROM table_name;
其中,輸出:
| 代碼 | 結果 |
|---|---|
| p700401- | p700401 |
| p791701- | p791701 |
| 100-,p788001-, | p788001 |
| 123-,p456789-xyz,p987654- | p987654 |
| p111111-,p222222-not_this,p333333-,p444444- | p111111,p333333,p444444 |
如果要將串列拆分為行,則:
SELECT t.code,
i.*
FROM (
SELECT code,
',' || REPLACE(code, ',', ',,') || ',' AS double_delims
FROM table_name
) t
INNER JOIN LATERAL (
SELECT LEVEL As item,
REGEXP_SUBSTR(double_delims, ',(p\d{6})-,|,(.*?),', 1, LEVEL, NULL, 1)
AS value
FROM DUAL
CONNECT BY LEVEL <= REGEXP_COUNT(double_delims, ',(p\d{6})-,|,(.*?),')
) i
ON (i.value IS NOT NULL);
哪個輸出:
| 代碼 | 物品 | 價值 |
|---|---|---|
| p700401- | 1 | p700401 |
| p791701- | 1 | p791701 |
| 100-,p788001-, | 2 | p788001 |
| 123-,p456789-xyz,p987654- | 3 | p987654 |
| p111111-,p222222-not_this,p333333-,p444444- | 1 | p111111 |
| p111111-,p222222-not_this,p333333-,p444444- | 3 | p333333 |
| p111111-,p222222-not_this,p333333-,p444444- | 4 | p444444 |
小提琴
uj5u.com熱心網友回復:
對于您發布的示例資料,這將回傳您想要的結果(即取“p”后跟 6 位數字):
SQL> with test (code) as
2 (select 'p700401-' from dual union all
3 select 'p791701-' from dual union all
4 select '100-,p788001-,' from dual
5 )
6 select code,
7 regexp_substr(code, 'p\d{6}') result
8 from test;
CODE RESULT
-------------- --------------
p700401- p700401
p791701- p791701
100-,p788001-, p788001
SQL>
uj5u.com熱心網友回復:
對,我的兩分錢是使用REGEXP_REPLACE():
CREATE TABLE tst (code) as
SELECT 'p700401-' FROM DUAL UNION ALL
SELECT 'p791701-' FROM DUAL UNION ALL
SELECT '100-,z123456' FROM DUAL UNION ALL
SELECT '100-,p788001-,' FROM DUAL UNION ALL
SELECT 'p788001-,100-' FROM DUAL UNION ALL
SELECT '123-,p456789-xyz,p987654-' FROM DUAL;
SELECT
code, REGEXP_REPLACE(REGEXP_REPLACE(code, '(p\d{6})-|.', '\1'), '(\d)(p)', '\1,\2') AS result
FROM tst
結果:
| 代碼 | 結果 |
|---|---|
| p700401- | p700401 |
| p791701- | p791701 |
| 100-,z123456 | 無效的 |
| 100-,p788001-, | p788001 |
| p788001-,100- | p788001 |
| 123-,p456789-xyz,p987654- | p456789,p987654 |
這是一個嵌套陳述句,因為根據給定的鏈接缺乏對方便的正則運算式語法的支持。
第一個正則運算式模式應該替換您所追求的以外的任何內容,請參閱在線演示。第二個是在后面插入逗號以分隔這些值,請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527114.html
標籤:sql正则表达式甲骨文
上一篇:強調單詞中沒有給出的部分
