我有一列,它是一個varchar2
包含類似的數據:....[A1]...[A2]...
我要拿出與字母字母開頭由[]
封裝的所有數據,並可以有一個或兩個數字,即:[B1]
,[B23]
。查找一個VARCHAR2()所有比賽
所以,我想是這樣的:「WHERE列就像'[__]' OR column is like '[___]'
但_
心不是隨便什麼價值,但是字母或數字
,並有可能將它們存儲在某種方式供以後使用
我有一列,它是一個varchar2
包含類似的數據:....[A1]...[A2]...
我要拿出與字母字母開頭由[]
封裝的所有數據,並可以有一個或兩個數字,即:[B1]
,[B23]
。查找一個VARCHAR2()所有比賽
所以,我想是這樣的:「WHERE列就像'[__]' OR column is like '[___]'
但_
心不是隨便什麼價值,但是字母或數字
,並有可能將它們存儲在某種方式供以後使用
大問題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
這是對小提琴的查詢,也可以在另一個查詢中使用。
你能?使用REGEXP_LIKE
找到匹配的值的正則表達式:!
[...] WHERE REGEXP(col_name, '\[[A-Z][0-9]{1,2}\]');
[...] 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
WHERE REGEXP_LIKE(col_name,'\ [[AE] {1} [0-9] {2} \]')解決了它! – 2013-03-15 14:43:27
現在是存儲[..]匹配並在另一個查詢中使用它們的方法? – 2013-03-15 14:45:40