如何从 Oracle Sql 中的列中获取所有模式
How to get all the patterns from the column in Oracle Sql
下面是专栏中的一段文字:
P348955: REMOVE NHA P210 PANEL PN : 6703ELM21 & REMOVE SUB ASSY PN:
ELM2000-10-10 (ITEM 70) QTY 2EA & PN: ELM200-11-10 OR ALT (ITEM 75)
QTY 1EA & PN ELM1057-1 QTY 1EA REQUESTED BY MMEECHAN REF ID 7369
我希望从该文本中提取所有相似的模式,
模式定义如下:
- 查找以 'PN' 或 'PN: ' 或 'PN '
开头的任何内容
- 提取上面模式后面的字母数字字符,我希望从上面显示的文本中提取以下内容
'PN : 6703ELM21' , 'PN: ELM2000-10-10' , 'PN: ELM200-11-10', 'PN ELM1057-1'
我尝试了以下方法:
SELECT REGEXP_SUBSTR( 'P348955: REMOVE NHA P210 PANEL PN : 6703ELM21 &
REMOVE SUB ASSY PN: ELM2000-10-10 (ITEM 70) QTY 2EA & PN: ELM200-11-10
OR ALT (ITEM 75) QTY 1EA & PN ELM1057-1 QTY 1EA REQUESTED BY MMEECHAN
REF ID 7369', '(PN+/s*+:?+/s*+[A-Z][0-9])' FROM DUAL;
所需输出为 PN:6703ELM21,PN:ELM2000-10-10,PN:ELM200-11-10,PN ELM1057-1
不确定如何获得此输出
这将使您每次出现一行输出:
WITH test_data (str, pattern) AS
(
SELECT 'P348955: REMOVE NHA P210 PANEL PN : 6703ELM21 &
REMOVE SUB ASSY PN: ELM2000-10-10 (ITEM 70) QTY 2EA & PN: ELM200-11-10
OR ALT (ITEM 75) QTY 1EA & PN ELM1057-1 QTY 1EA REQUESTED BY MMEECHAN
REF ID 7369'
,'PN\s*:?\s*(\w|-)*'
FROM DUAL
)
SELECT regexp_substr(str,pattern,1,level,'im' ) FROM test_data
CONNECT BY regexp_substr(str,pattern,1,level,'im' ) IS NOT NULL;
PN : 6703ELM21
PN: ELM2000-10-10
PN: ELM200-11-10
PN ELM1057-1
另一种选择:
SELECT substr
FROM (
SELECT REGEXP_SUBSTR(str, 'PN(\s|\:)+(\d|\w)+?[^ ]+', 1, LEVEL) AS substr
FROM (
SELECT 'P348955: REMOVE NHA P210 PANEL PN : 6703ELM21 and REMOVE SUB ASSY PN: ELM2000-10-10 (ITEM 70) QTY 2EA and PN: ELM200-11-10 OR ALT (ITEM 75) QTY 1EA snd PN ELM1057-1 QTY 1EA REQUESTED BY MMEECHAN REF ID 7369' AS str
FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, 'PN(\s|\:)+(\d|\w)+?[^ ]+')) + 1
)
WHERE substr is not null;
下面是专栏中的一段文字:
P348955: REMOVE NHA P210 PANEL PN : 6703ELM21 & REMOVE SUB ASSY PN: ELM2000-10-10 (ITEM 70) QTY 2EA & PN: ELM200-11-10 OR ALT (ITEM 75) QTY 1EA & PN ELM1057-1 QTY 1EA REQUESTED BY MMEECHAN REF ID 7369
我希望从该文本中提取所有相似的模式, 模式定义如下:
- 查找以 'PN' 或 'PN: ' 或 'PN ' 开头的任何内容
- 提取上面模式后面的字母数字字符,我希望从上面显示的文本中提取以下内容
'PN : 6703ELM21' , 'PN: ELM2000-10-10' , 'PN: ELM200-11-10', 'PN ELM1057-1'
我尝试了以下方法:
SELECT REGEXP_SUBSTR( 'P348955: REMOVE NHA P210 PANEL PN : 6703ELM21 &
REMOVE SUB ASSY PN: ELM2000-10-10 (ITEM 70) QTY 2EA & PN: ELM200-11-10
OR ALT (ITEM 75) QTY 1EA & PN ELM1057-1 QTY 1EA REQUESTED BY MMEECHAN
REF ID 7369', '(PN+/s*+:?+/s*+[A-Z][0-9])' FROM DUAL;
所需输出为 PN:6703ELM21,PN:ELM2000-10-10,PN:ELM200-11-10,PN ELM1057-1
不确定如何获得此输出
这将使您每次出现一行输出:
WITH test_data (str, pattern) AS
(
SELECT 'P348955: REMOVE NHA P210 PANEL PN : 6703ELM21 &
REMOVE SUB ASSY PN: ELM2000-10-10 (ITEM 70) QTY 2EA & PN: ELM200-11-10
OR ALT (ITEM 75) QTY 1EA & PN ELM1057-1 QTY 1EA REQUESTED BY MMEECHAN
REF ID 7369'
,'PN\s*:?\s*(\w|-)*'
FROM DUAL
)
SELECT regexp_substr(str,pattern,1,level,'im' ) FROM test_data
CONNECT BY regexp_substr(str,pattern,1,level,'im' ) IS NOT NULL;
PN : 6703ELM21
PN: ELM2000-10-10
PN: ELM200-11-10
PN ELM1057-1
另一种选择:
SELECT substr
FROM (
SELECT REGEXP_SUBSTR(str, 'PN(\s|\:)+(\d|\w)+?[^ ]+', 1, LEVEL) AS substr
FROM (
SELECT 'P348955: REMOVE NHA P210 PANEL PN : 6703ELM21 and REMOVE SUB ASSY PN: ELM2000-10-10 (ITEM 70) QTY 2EA and PN: ELM200-11-10 OR ALT (ITEM 75) QTY 1EA snd PN ELM1057-1 QTY 1EA REQUESTED BY MMEECHAN REF ID 7369' AS str
FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, 'PN(\s|\:)+(\d|\w)+?[^ ]+')) + 1
)
WHERE substr is not null;