2017-01-30 2 views
0

Ich möchte überprüfen, ob 3 bestimmte Wörter in einer Spalte vorhanden ist oder nicht eine Oracle-Abfrage verwenden.Existenz von 3 Wörtern in einer Zeichenfolge in Oracle-Abfrage

Zum Beispiel ist mein Spaltenwert: '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'.

Ich möchte überprüfen, ob die drei Wörter Earth, und buildings in der Zeichenfolge vorhanden sind.

Wie kann ich dies in einer Oracle-Abfrage tun?

+2

Suchen Sie nach Wörtern oder Zeichenfolgen? Spricht "ausgraben" oder "Erdling"? –

+0

nur exakte Wörter. "Ausgraben" sollte nicht zählen. – Sarath

Antwort

4

Sie möchten wahrscheinlich nur nach Wörtern suchen. Also, wenn Sie nach 'space' suchen, wollen Sie nicht sagen, 'respaced'. Verwenden Sie REGEXP_LIKE mit Wortgrenzen:

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

Für Effizienz ist es immer am besten, die wahrscheinlichste Übereinstimmung zuerst in einem Wechsel zu setzen: '(\ W | ^)' anstatt umgekehrt (obwohl in diesem Fall wird es wahrscheinlich wenig Unterschied machen). Ansonsten sollte dies der Gewinner sein. – mathguy

0

Verwendung so etwas wie dies in der where-Klausel (wenn Sie über den Fall um genau sein wollen):

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

als @ Tim in den Kommentaren darauf hingewiesen, wenn Sie Fall ignorieren möchten, können Sie durch Verwendung von oberem() oder niedriger():

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

usw.

+1

Verwenden Sie 'UPPER (col_name) LIKE '% EARTH%', um mögliche Groß- und Kleinschreibungsprobleme zu behandeln. –

+2

Vorsicht vor dem "Mutter ist in der Chemotherapie" Problem. Es heißt, weil das Wort "Mutter", nach dem Sie vermutlich suchen, auch innerhalb des Wortes "che ** mother ** apy" gefunden wird. – mathguy

+0

@mathguy hat Recht - das wird Unterwörter zurückgeben. Ich habe Throstens Antwort aufgehoben. –

0

verwenden regexp:

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

Dies ist der richtige Ansatz. Mit dem Gesagten: Aus Effizienzgründen ist es in jeder Alternationsgruppe (wie in Ihrer ersten Gruppe, die entweder nach dem Anfang der Zeichenfolge oder nach etwas anderem sucht) für die Effizienz am besten, die häufigste Übereinstimmung zuerst zu setzen; lege das '^' zuletzt, da es weniger oft gepaart wird. Außerdem: hast du absichtlich "Erde, Galaxien, Gebäude" (ohne Leerzeichen) zu einem ** non ** - Spiel gemacht? – mathguy

0

"Erde" "Erde" sollte als Wort entsprechend der Logik gewählt werden. Die Verwendung von% Earth% wird auch für Wörter wie "Un-Earth" oder "Erding" gelten und Sie wollen es nicht. So

,

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

auf, wie viele Daten beschädigt ist, können Sie mehrere Zustand innen oder hinzufügen.

Verwandte Themen