Pl/Sql mit instr genaue übereinstimmung zu finden
Ich versuche, herauszufinden, ob ein string existiert in Wort und entpacken Sie es. Ich habe verwendet die instr()
Funktion aber diese funktioniert wie der LIKE-Funktion: wenn ein Teil oder das ganze Wort existiert, gibt es zurück.
Hier ich will den string 'Dienstleistungen' aus, es funktioniert, aber wenn ich 'Dienstleistungen' zu 'Service' es funktioniert immer noch. Ich möchte das nicht. Wenn 'Service' eingetragen ist, sollte es null zurückgeben, und nicht 'Dienste'
Geändert:
Was ich versuche zu tun, ist hier abzukürzen, bestimmte Teile des Firmennamens.
Dies ist, was meine Datenbank-Tabelle sieht wie folgt aus :
Word | Abb
---------+-----
Company | com
Limited | ltd
Service | serv
Services | servs
Hier ist der code:
Declare
Cursor Words Is
SELECT word,abb
FROM abbWords
processingWord VARCHAR2(50);
abbreviatedName VARCHAR(120);
fullName = 'A.D Company Services Limited';
BEGIN
FOR eachWord IN Words LOOP
--find the position of the word in name
wordPosition := INSTR(fullName, eachWord.word);
--extracts the word form the full name that matches the database
processingWord := Substr(fullName,instr(fullName,eachWord.word), length(eachWord.word));
--only process words that exist in name
if wordPosition > 0 then
abbreviatedName = replace(fullName, eachWord.word,eachWord.abb);
end if;
END lOOP;
END;
So, wenn der Benutzer 'Service' ich will nicht 'Dienste' zurückgegeben werden. Damit meine ich word-position sollte 0 sein, wenn das Wort 'Service' in nicht gefunden werden, anstatt die position, für die das Wort 'Dienste'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere alternative ist die Verwendung von so etwas wie:
Dieser ersetzt nur das Wort "Serv" befindet sich zwischen 2 Räumen.
Danke,
Alex.
Einen Weg, es zu tun:
INSTR()
0 zurück, wenn der text nicht gefunden wird.DECODE()
wertet das erste argument, zu vergleichen, um die zweite, wenn Spiel, Rückkehr drittes argument, wenn nicht, zurück vierte argument. (sqlfiddle link)Wohl nicht der eleganteste Weg, aber entspricht Ihrer Anforderung.
Ich denke du bist über-erschweren dies. Sie können alles tun, mit reguläre Ausdrücke. Zum Beispiel; die folgende Tabelle:
Dieser Abfrage werden nur die Namen
'A.D Company Services Limited'
.Dies bedeutet den Anfang der Zeichenkette,
^
oder ein Leerzeichen gefolgt von Dienstleistungen, die nach dem Ende der Zeichenfolge$
oder ein Leerzeichen. Dies ist, was unterscheidet reguläre Ausdrücke aus mitinstr
etc. Sie können Ihre Spiele einfach abhängig von anderen Faktoren.Jedoch, obwohl dies zu sein scheint, Ihre Frage, die ich glaube nicht, dass dies ist, was Sie zu tun versuchen. Sie versuchen, ersetzen Sie die Zeichenfolge
'serv'
in Ihrer weiteren string ohne Ersetzung'services'
oder'service'
. Für diese müssen Sie verwendenregexp_replace()
.Wenn ich fügen Sie die folgende Zeile zur Tabelle:
und diese Abfrage ausführen:
Den nur Sache, die sich ändern wird ist
' Serv '
, die in diese neueste Linie, ersetzt werden, mit' Services '
. Beachten Sie das Leerzeichen, wie Sie nicht möchten, zu ersetzen'Services'
mit'ServServices'
diese sind sehr wichtig.Hier ein wenig SQL Fiddle zu demonstrieren.
INSTR
gibt eine Zahl zurück: den index des ersten Auftretens der übereinstimmenden Zeichenfolge. Sie verwenden sollten,regexp_substr
statt (10g+):