2013-03-15 66 views
0

我有一列,它是一個varchar2包含類似的數據:....[A1]...[A2]... 我要拿出與字母字母開頭由[]封裝的所有數據,並可以有一個或兩個數字,即:[B1],[B23]查找一個VARCHAR2()所有比賽

所以,我想是這樣的:「WHERE列就像'[__]' OR column is like '[___]'_心不是隨便什麼價值,但是字母或數字

,並有可能將它們存儲在某種方式供以後使用

回答

1

大問題Here's a Fiddle展示如何查詢匹配到結果集

而這裏的的情況下,長解釋查詢的小提琴就沒有意義了:)

我使用了一個名爲RegEx_Test與列MyVal表。下面是表的內容:

MyVal 
------------------------------ 
[A1][abc][B23][D123]a33[bx5] 
[Z15][ax0][B0][F13]R3 
[X215][A3A][J99]F33F33G24[43][R3] 
[Z99][c1][F3][d33]3x24[Y3][f13] 
[9a][D41][Q39][XX12]B27[T03][J12] 

你的正則表達式整個是這樣的:\[[[:alpha:]][[:digit:]]{1,2}\]。除了POSIX :alpha::digit:指標之外,它與其他答案相同,在國際字符集的情況下更安全。

首先,您需要知道任何行上的最大匹配數。使用REGEXP_COUNT本:

SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]')) 
    FROM Regex_Test 

MAX(REGEXP_COUNT(My... 
---------------------- 
        6 

使用最大計數得到一個「反」表(這是下面的SELECT ... FROM DUAL)和具有查詢,將使用REGEXP_SUBSTR拉你的價值觀交叉聯接計數器表。 REGEXP_SUBSTR有一個「發現」參數,並且將使用Counter

SELECT 
    MyVal, 
    Counter, 
    REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched 
FROM Regex_Test 
CROSS JOIN (
    SELECT LEVEL Counter 
    FROM DUAL 
    CONNECT BY LEVEL <= (
    SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]')) 
    FROM Regex_Test)) Counters 

下面是對我的表樣品運行(部分結果):

MyVal        Counter Matched 
---------------------------------- ------- ------- 
[9a][D41][Q39][XX12]B27[T03][J12]  1 [D41] 
[9a][D41][Q39][XX12]B27[T03][J12]  2 [Q39] 
[9a][D41][Q39][XX12]B27[T03][J12]  3 [T03] 
[9a][D41][Q39][XX12]B27[T03][J12]  4 [J12] 
[9a][D41][Q39][XX12]B27[T03][J12]  5 
[9a][D41][Q39][XX12]B27[T03][J12]  6 
[A1][abc][B23][D123]a33[bx5]    1 [A1] 
[A1][abc][B23][D123]a33[bx5]    2 [B23] 
[A1][abc][B23][D123]a33[bx5]    3 
... and so on - total is 30 rows 

此時你有一個結果集的個體匹配,加上行數小於最大匹配的空值。這些比賽仍然有其周圍的括號。環繞與外部查詢,將篩選出空白和刪除括號中的整個事情,你有你的最終名單:

SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM (
    SELECT 
    MyVal, 
    Counter, 
    REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched 
    FROM Regex_Test 
    CROSS JOIN (
    SELECT LEVEL Counter 
    FROM DUAL 
    CONNECT BY LEVEL <= (
     SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]')) 
     FROM Regex_Test)) Counters 
) WHERE Matched IS NOT NULL 

這是對小提琴的查詢,也可以在另一個查詢中使用。

1

你能?使用REGEXP_LIKE找到匹配的值的正則表達式:!

[...] WHERE REGEXP(col_name, '\[[A-Z][0-9]{1,2}\]'); 
+0

[...] WHERE REGEXP(col_name,'\ [[A-Z] [0-9] {1,2} \]');給出了與REGEXP_LIKE(col_name,'\ [[AZ] [0-9] {1,1} \]'相同的結果。正如我介紹的那樣,第一個正則表達式操作查找2個數字,而第二個正則表達式查找一個數字。 – 2013-03-15 14:24:07

+0

WHERE REGEXP_LIKE(col_name,'\ [[AE] {1} [0-9] {2} \]')解決了它! – 2013-03-15 14:43:27

+0

現在是存儲[..]匹配並在另一個查詢中使用它們的方法? – 2013-03-15 14:45:40