2016-02-12 132 views
0

我遇到了一些問題,我似乎無法像正則表達式匹配3個或更多個a或e的名稱。使用正則表達式的SQL REGEXP_LIKE()

找到所有管理員工,他們的名字中至少有3個字母'a'或'e'(大寫字母分別爲 和小寫字母)。例如具有2「a」和在名稱1「E」,將滿足選擇標準

select manager_name 
    from manages 
where regexp_like(employee_name, '[a,e]{3, }'); 

當我做到這一點示出了具有一個「e」或「a」在它的適當列表中,但當我嘗試做3或更多時,它返回空白集。下面還提供了示例數據。

select manager_name 
    from manages 
where regexp_like(employee_name, '[a,e]'); 

樣本數據

William Gates III 
Lakshmi Mittal 
Ingvar Kamprad 
Lawrence Ellison 
Mark Zuckerberg 
Sheryl Sandberg 
Liliane Bettencourt 
Michael Dell 
+0

你可以分享一些示例輸入並解釋返回的輸出是如何錯誤的。另外,你使用的是哪個[tag:rdbms]? – Mureinik

+1

'[aae] {3,}'是Oracle的良好正則表達式 – Blag

+0

,它在不應該返回時會返回一個空白集。 – camdixon

回答

1

你要找的這個代替

(.*[ae]){3,} 

.*接受那些之間型動物字符想

所以,你的查詢變爲:

select manager_name 
    from manages 
    where 
    regexp_like(employee_name, '(.*[ae]){3,}', 'i'); 

i標誌是不敏感的比賽,所以......如果ommitted,進行敏感的匹配資金AE考慮到...

您也可以使用簡單的{3}代替{3,},它會產生相同的結果在這種情況下

+0

。*做什麼?任何一個字符一次或多次? – camdixon

+0

'我'在查詢結束時做了什麼? – camdixon

+0

「i''是匹配參數並告訴Oracle執行不區分大小寫的搜索。 '。*'是任意字符('.')零次或多次('*')。 –

0

如果你想至少3 a的或e的任何地方的名字,然後

select manager_name 
from manages 
where regexp_like(employee_name, '(.*?[ae]){3,}', 'i'); 

如果你想至少連續3 a的或e當時的:

select manager_name 
from manages 
where regexp_like(employee_name, '.*[ae]{3,}', 'i'); 
0

您可以嘗試使用REGEXP_COUNT()代替REGEXP_LIKE()

SELECT manager_name 
    FROM manages 
WHERE REGEXP_COUNT(employee_name, '[ae]', 1, 'i') >= 3; 

第三個參數的REGEXP_COUNT()值表示搜索開始的位置(在這種情況下,我們希望從頭開始),而match_parameter 'i'表示搜索應區分大小寫。

REGEXP_COUNT()增加了Oracle 11g;如果您正在使用Oracle的早期版本,那麼你可以嘗試以下方法:

SELECT manager_name 
    FROM manages 
WHERE REGEXP_INSTR(employee_name, '[ae]', 1, 3, 0, 'i') > 0; 

以上(3)第四個參數是正則表達式的出現次數。

或:

SELECT manager_name 
    FROM manages 
WHERE REGEXP_SUBSTR(employee_name, '[ae]', 1, 3, 'i') IS NOT NULL; 

無論哪種方式,它使正則表達式的,如果你使用REGEXP_LIKE()簡單。