it-swarm.com.de

So wählen Sie einen Teilstring in Oracle SQL bis zu einem bestimmten Zeichen aus?

Angenommen, ich habe eine Tabellenspalte mit Ergebnissen wie:

ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore

Ich möchte in der Lage sein, eine Abfrage zu schreiben, die diese Spalte aus der Tabelle auswählt, jedoch nur den Teilstring bis zum Unterstrichzeichen (_) zurückgibt. Zum Beispiel:

ABC
DEFGH
IJKLMNOP

Die SUBSTRING-Funktion scheint der Aufgabe nicht gerecht zu werden, da sie positionsbasiert ist und die Position des Unterstrichs variiert.

Ich habe über die TRIM-Funktion (speziell die RTRIM-Funktion) nachgedacht:

SELECT RTRIM('listofchars' FROM somecolumn) 
FROM sometable

Ich bin mir jedoch nicht sicher, wie ich das funktionieren lassen würde, da es nur scheint, eine bestimmte Liste/Gruppe von Zeichen zu entfernen, und ich bin wirklich erst nach den Zeichen, die zum Unterstrich führen.

64
Pretzel

Bei Verwendung einer Kombination aus SUBSTR, INSTR und NVL (für Zeichenfolgen ohne Unterstrich) wird das zurückgegeben, was Sie möchten:

SELECT NVL(SUBSTR('ABC_blah', 0, INSTR('ABC_blah', '_')-1), 'ABC_blah') AS output
  FROM DUAL

Ergebnis:

output
------
ABC

Benutzen:

SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output
  FROM YOUR_TABLE t

Referenz:

Nachtrag

Wenn Sie Oracle10g + verwenden, können Sie Regex über REGEXP_SUBSTR verwenden.

122
OMG Ponies

Dies kann einfach mit REGEXP_SUBSTR durchgeführt werden.

Benutzen Sie bitte 

REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 

dabei ist STRING_EXAMPLE Ihre Zeichenfolge.

Versuchen:

SELECT 
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 
from dual

Es wird Ihr Problem lösen.

34
user1717270

Sie müssen die Position des ersten Unterstrichs (mit INSTR) ermitteln und dann den Teil des Strings vom ersten Zeichen mit (pos-1) mithilfe von substr abrufen.

  1  select 'ABC_blahblahblah' test_string,
  2         instr('ABC_blahblahblah','_',1,1) position_underscore,
  3         substr('ABC_blahblahblah',1,instr('ABC_blahblahblah','_',1,1)-1) result
  4*   from dual
SQL> /

TEST_STRING      POSITION_UNDERSCORE RES
---------------- ------------------  ---
ABC_blahblahblah                  4  ABC

Instr-Dokumentation

Susbtr-Dokumentation

7
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)  from dual

ist die richtige Antwort, wie von user1717270 geschrieben

Wenn Sie INSTR verwenden, erhalten Sie die Position für einen String, der davon ausgeht, dass er "_" enthält. Was ist, wenn nicht? Nun, die Antwort lautet 0. Wenn Sie die Zeichenfolge drucken möchten, wird eine NULL..__ ausgegeben. Beispiel: Wenn Sie die Domäne aus einer "Host.domain" entfernen möchten. In einigen Fällen haben Sie nur den Kurznamen, d. H. "Host". Wahrscheinlich möchten Sie "Host" drucken. Nun, mit INSTR erhalten Sie eine NULL, da kein "." Gefunden wurde, d. H. Es wird von 0 bis 0 gedruckt. Mit REGEXP_SUBSTR erhalten Sie in allen Fällen die richtige Antwort:

SELECT REGEXP_SUBSTR('Host.DOMAIN','[^.]+',1,1)  from dual;

Wirt

und

SELECT REGEXP_SUBSTR('Host','[^.]+',1,1)  from dual;

Wirt

5
Loquillo Amigo

Eine andere Möglichkeit wäre die Verwendung von REGEXP_SUBSTR.

2
EvilTeach

Denken Sie daran, wenn alle Ihre Zeichenfolgen in der Spalte keinen Unterstrich haben (... oder sonst, wenn der Wert null ist, wird die Ausgabe ausgeführt):

SELECT COALESCE
(SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1), 
"STRING_COLUMN") 
AS OUTPUT FROM DUAL
0
SJOH

So suchen Sie eine Unterzeichenfolge aus einer großen Zeichenfolge:

string_value:=('This is String,Please search string 'Ple');

Um den String 'Ple' aus String_value zu finden, können wir folgendes tun:

select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;

Sie finden das Ergebnis: Ple

0
vishal Pathak