2017-01-30 51 views
0

我想檢查一列中是否存在3個特定單詞或者不使用Oracle查詢。在oracle查詢中存在一個字符串中的3個單詞

例如,我的列值是: 'Google Earth lets you fly anywhere on Earth to view satellite imagery, maps, terrain, 3D buildings, from galaxies in outer space to the canyons of the ocean'

我想檢查字符串中是否存在三個字Earth,galaxiesbuildings

如何在Oracle查詢中執行此操作?

+2

您是在尋找單詞或字符串嗎? 「發掘」還是「接地」數? –

+0

只有確切的單詞。 「挖掘」不應該算在內。 – Sarath

回答

4

你只想找單詞。因此,在尋找'space'時,您不希望找到'respaced'。使用REGEXP_LIKE帶詞邊界:

select * 
from mytable 
where regexp_like(text, '(^|\W)earth(\W|$)', 'i') 
    and regexp_like(text, '(^|\W)galaxies(\W|$)', 'i') 
    and regexp_like(text, '(^|\W)buildings(\W|$)', 'i'); 
+0

爲了提高效率,最好先交替使用'(\ W | ^)'而不是其他方式(儘管在這種情況下它可能沒有什麼區別)。除此之外,這應該是贏家。 – mathguy

0

使用類似這樣的where子句中(如果你想確切瞭解的情況下):

where col_name like '%Earth%' 
and col_name like '%galaxies%' 
and col_name like '%buildings%' 

爲@Tim在評論中指出的,如果你想忽略的情況下,可以通過使用上()或低級():

where upper(col_name) like '%EARTH%' 
and upper(col_name) like '%GALAXIES%' 

+1

使用'UPPER(col_name)LIKE'%EARTH%'來處理可能的大小寫敏感問題。 –

+2

謹防「母親在化療」問題。這就是所謂的,因爲在「che ** mother ** apy」這個單詞中也可以找到你想要搜索的單詞「mother」。 – mathguy

+0

@mathguy是對的 - 這將返回子字詞。我提出了Throsten的回答。 –

0

使用正則表達式:

WITH tmp AS 
    (
    SELECT 'Earth, galaxies and buildings' str FROM dual UNION ALL 
    SELECT 'Earth, buildings and galaxies' str FROM dual UNION ALL 
    SELECT 'Earth2, galaxies and buildings' str FROM dual UNION ALL 
    SELECT 'Earth , galaxies and buildings' str FROM dual UNION ALL 
    SELECT 'Earth,galaxies,buildings' str FROM dual UNION ALL 
    SELECT 'Earthgalaxiesbuildings' str FROM dual UNION ALL 
    SELECT 'earth, galaxies and buildings' str FROM dual 
) 
SELECT 
    str 
FROM 
    tmp 
WHERE 
    REGEXP_LIKE(UPPER(str), '([[:punct:][:space:]]|^)EARTH([[:punct:][:space:]]|$)') AND 
    REGEXP_LIKE(UPPER(str), '([[:punct:][:space:]]|^)GALAXIES([[:punct:][:space:]]|$)') AND 
    REGEXP_LIKE(UPPER(str), '([[:punct:][:space:]]|^)BUILDINGS([[:punct:][:space:]]|$)') 
+0

這是正確的做法。這就是說:爲了提高效率,在任何輪換組(比如你的第一組,搜索字符串的開頭或其他內容)時,最有效率的方法是首先進行最常見的匹配;把'^'放在最後,因爲它會少一些匹配。另外:你是否故意讓「地球,星系,建築物」(沒有空間)成爲一個**非**比賽? – mathguy

0

應根據邏輯選擇「地球」「地球」作爲單詞。使用'%Earth%'對於像「Un-Earth」或「Earthing」這樣的字詞也會成爲現實,而您並不需要它。

所以,

where (upper(col) like upper('% earth %') OR upper(col) like upper('% earth.%') OR upper(col) like upper('% earth,%')) AND 
    (upper(col) like upper('% galaxies %') OR upper(col) like upper('% galaxies.%') OR upper(col) like upper('% galaxies,%')) AND 
    upper(col) like upper('% buildings %') OR upper(col) like upper('% buildings.%') OR upper(col) like upper('% buildings,%')) 

基於有多少數據被破壞,你可以在室內或添加多個條件。

相關問題