2017-10-11 321 views
0

我想從VAL列中提取一些字符串,根據下面的粗體正則表達式。這是數據的一個例子,我有來源:在SQL語句中使用正則表達式提取幾個字符串 - Oracle

Table1 
----------------- 
ID   VAL  
----------------- 
1   GR-RDE 
2   GR-RZA-RDE 
3   GR-RZA-RDE_RZA 
4   GR-RGS 
5   GR-RZA-OR-ORC 
6   GR-RZA-RDE-OR-ORC_RZA 

期望的結果:

> Output 
----------------- 
ID   RESULT  
----------------- 
1   RDE 
2   RZA 
2   RDE 
3   RZA 
3   RDE 
4   RGS 
5   RZA 
5   OR 
6   RZA 
6   RDE 
6   OR 

爲了做到這一點,我已經做到了這一點正則表達式: (< = - ?)(RDE | RZA | RGS | OR)([AZ])

  • (< = - ):?!?檢查該字符之前是 ' - '
  • (RDE | RZA | RGS | OR):搜索'RDE','RZA','RGS','OR'字符串
  • (?![AZ]):忽略字符串,如果後面跟着一個字母

正則表達式完美的作品,它忽略了所有的unwhanted部分: Regex to handle the process

我的問題是,我不覺得用在SQL語句這個表達式(Oracle數據庫)的方式。我試着像這樣的東西,它返回空值進行測試:

select REGEXP_SUBSTR(VAL,'(?<=-)(RDE|RZA|RGS|OR)(?![A-Z])') from Table1; 
+0

恐怕Oracle不支持環視:( – Toto

+0

好了,所以也許我需要找到另一個w唉要做到這一點,而不使用正則表達式。 – baboufight

回答

1

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE Table1 (ID, VAL) AS 
SELECT 1, 'GR-RDE' FROM DUAL UNION ALL 
SELECT 2, 'GR-RZA-RDE' FROM DUAL UNION ALL 
SELECT 3, 'GR-RZA-RDE_RZA' FROM DUAL UNION ALL 
SELECT 4, 'GR-RGS' FROM DUAL UNION ALL 
SELECT 5, 'GR-RZA-OR-ORC' FROM DUAL UNION ALL 
SELECT 6, 'GR-RZA-RDE-OR-ORC_RZA' FROM DUAL 

查詢1

WITH words (id, val, lvl, str, maxlvl) AS (
    SELECT id, 
     val, 
     1, 
     REGEXP_SUBSTR(val, '[A-Z]+', 1, 1), 
     REGEXP_COUNT(val, '[A-Z]+') 
    FROM table1 
UNION ALL 
    SELECT id, 
     val, 
     lvl + 1, 
     REGEXP_SUBSTR(val, '[A-Z]+', 1, lvl + 1), 
     maxlvl 
    FROM words 
    WHERE lvl < maxlvl 
) 
SELECT id, str, lvl 
FROM words 
ORDER BY id, lvl 

Results

| ID | STR | LVL | 
|----|-----|-----| 
| 1 | GR | 1 | 
| 1 | RDE | 2 | 
| 2 | GR | 1 | 
| 2 | RZA | 2 | 
| 2 | RDE | 3 | 
| 3 | GR | 1 | 
| 3 | RZA | 2 | 
| 3 | RDE | 3 | 
| 3 | RZA | 4 | 
| 4 | GR | 1 | 
| 4 | RGS | 2 | 
| 5 | GR | 1 | 
| 5 | RZA | 2 | 
| 5 | OR | 3 | 
| 5 | ORC | 4 | 
| 6 | GR | 1 | 
| 6 | RZA | 2 | 
| 6 | RDE | 3 | 
| 6 | OR | 4 | 
| 6 | ORC | 5 | 
| 6 | RZA | 6 | 

查詢2

SELECT t.id, w.COLUMN_VALUE AS str 
FROM Table1 t 
     CROSS JOIN 
     TABLE(
     CAST(
      MULTISET(
      SELECT REGEXP_SUBSTR(t.val, '[A-Z]+', 1, LEVEL) 
      FROM DUAL 
      CONNECT BY LEVEL <= REGEXP_COUNT(t.val, '[A-Z]+') 
      ) AS SYS.ODCIVARCHAR2LIST 
     ) 
     ) w 

Results

| ID | STR | 
|----|-----| 
| 1 | GR | 
| 1 | RDE | 
| 2 | GR | 
| 2 | RZA | 
| 2 | RDE | 
| 3 | GR | 
| 3 | RZA | 
| 3 | RDE | 
| 3 | RZA | 
| 4 | GR | 
| 4 | RGS | 
| 5 | GR | 
| 5 | RZA | 
| 5 | OR | 
| 5 | ORC | 
| 6 | GR | 
| 6 | RZA | 
| 6 | RDE | 
| 6 | OR | 
| 6 | ORC | 
| 6 | RZA | 
+0

智能解決方法,謝謝! – baboufight

相關問題