2017-01-30 9 views
0

Oracleクエリーを使用して3つの特定の単語がカラムに存在するかどうかをチェックしたい。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'です。

文字列にEarthgalaxiesbuildingsの3単語が存在するかどうかを確認したいと思います。

これはどのように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句では、このような

使用何か(あなたが事件について正確にしたい場合):

@Timあなたはケースを無視したい場合は、コメントで指摘したように
where col_name like '%Earth%' 
and col_name like '%galaxies%' 
and col_name like '%buildings%' 

、あなたができることにより、使用)((上側)以下:

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

+1

'UPPER(col_name)LIKE '%EARTH%''を使用して、大文字と小文字の区別の問題を処理します。 –

+2

"母親は化学療法中"の問題に注意してください。おそらくあなたが探している "母"という言葉が "che ** mother ** apy"という言葉の中にもあるので、それはそれと呼ばれています。 – mathguy

+0

@mathguyが正しいです - これはサブワードを返します。私はスローステンの答えをアップウィニングしました。 –

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" "Earth"はロジックごとに単語として選択する必要があります。 '%Earth%'を使用すると、「Un-Earth」や「Earthing」のような単語にも適用され、あなたはそれを望んでいません。

ので、破損している、あなたはOR内で複数の条件を追加することができますどのくらいのデータに基づいて

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,%')) 

関連する問題