Angenommen, ich habe eine Tabellenspalte mit folgenden Ergebnissen:
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
Ich möchte in der Lage sein, eine Abfrage zu schreiben, die diese Spalte aus dieser Tabelle auswählt, aber nur die Teilzeichenfolge bis zum Unterstrich (_) zurückgibt. Beispielsweise:
ABC
DEFGH
IJKLMNOP
Die SUBSTRING-Funktion scheint der Aufgabe nicht gewachsen zu sein, da sie positionsbasiert ist und die Position des Unterstrichs variiert.
Ich dachte über die TRIM-Funktion nach (speziell die RTRIM-Funktion):
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
Aber ich bin mir nicht sicher, wie ich das zum Laufen bringen soll, da es nur eine bestimmte Liste / einen bestimmten Satz von Zeichen zu entfernen scheint und ich wirklich nur nach den Zeichen bin, die zum Unterstrich führen.
instr
Gibt 0 zurück, wenn Sie habenINSTR('ABC/D', '_')
. Am Ende haben Sie einen Teilstring von 0 bis (0-1), der null ist. Nicht gut.Dies kann einfach mit REGEXP_SUBSTR erfolgen .
Benutzen Sie bitte
Dabei ist STRING_EXAMPLE Ihre Zeichenfolge.
Versuchen:
Es wird Ihr Problem lösen.
quelle
INSTR
Lösung ungefähr genauso schnell wie dieREGEXP
Lösung.Sie müssen die Position des ersten Unterstrichs (mit INSTR) ermitteln und dann den Teil des Strings mit substr vom ersten Zeichen bis (pos-1) abrufen.
Instr Dokumentation
Susbtr Dokumentation
quelle
ist die richtige Antwort, wie von user1717270 gepostet
Wenn Sie verwenden
INSTR
, erhalten Sie die Position für eine Zeichenfolge, die davon ausgeht, dass sie "_" enthält. Was ist, wenn es nicht so ist? Nun, die Antwort ist 0. Wenn Sie also die Zeichenfolge drucken möchten, wird a gedrucktNULL
. Beispiel: Wenn Sie die Domain aus einer "host.domain" entfernen möchten. In einigen Fällen haben Sie nur den Kurznamen "Host". Höchstwahrscheinlich möchten Sie "Host" drucken. Nun,INSTR
damit erhalten Sie ein,NULL
weil es kein "." Gefunden hat, dh es wird von 0 bis 0 gedruckt. Mit erhaltenREGEXP_SUBSTR
Sie in allen Fällen die richtige Antwort:GASTGEBER
und
GASTGEBER
quelle
Eine andere Möglichkeit wäre die Verwendung von REGEXP_SUBSTR.
quelle
Denken Sie daran, wenn alle Ihre Zeichenfolgen in der Spalte keinen Unterstrich haben (... oder wenn der Nullwert die Ausgabe ist):
quelle
So finden Sie eine Unterzeichenfolge aus einer großen Zeichenfolge:
Um den String
'Ple'
von zu finden,String_value
können wir wie folgt vorgehen:Sie finden Ergebnis:
Ple
quelle
Falls die String-Position nicht festgelegt ist, können wir mit der folgenden Select-Anweisung die erwartete Ausgabe erhalten.
Tabellenstruktur ID VARCHAR2 (100 BYTE) CLIENT VARCHAR2 (4000 BYTE)
Daten-ID CLIENT
1001 {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"}
1002 {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"}
Voraussetzung - Suchen Sie in der Spalte CLIENT nach der Zeichenfolge "ClientId" und geben Sie den entsprechenden Wert zurück. Wie von "clientId": "con-bjp" -> con-bjp (erwartete Ausgabe)
Wählen Sie CLIENT, substr (substr (CLIENT, instr (CLIENT, '"clientId": "') + length ('" clientId ":"')), 1, instr (substr (CLIENT, instr (CLIENT, '"clientId") : "') + Länge ('" clientId ":" ')),' "', 1) -1) cut_str von TEST_SC;
CLIENT cut_str ------------------------------------------------ ----------- ---------- {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"} con bjp {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"} Test-Cust
quelle