Comment sélectionner une sous-chaîne dans Oracle SQL pour un caractère spécifique?

Disons que j’ai une colonne de table qui a des résultats comme:

ABC_blahblahblah DEFGH_moreblahblahblah IJKLMNOP_moremoremoremore 

Je voudrais pouvoir écrire une requête qui sélectionne cette colonne de cette table, mais ne renvoie que la sous-chaîne au caractère Underscore (_). Par exemple:

 ABC DEFGH IJKLMNOP 

La fonction SUBSTRING ne semble pas être à la hauteur car elle est basée sur la position et la position du trait de soulignement varie.

J’ai pensé à la fonction TRIM (la fonction RTRIM spécifiquement):

 SELECT RTRIM('listofchars' FROM somecolumn) FROM sometable 

Mais je ne suis pas sûr de savoir comment cela fonctionnerait, car il semble que cela supprime seulement une certaine liste / série de caractères et je ne suis vraiment qu’après les caractères menant au caractère Underscore.

En utilisant une combinaison de SUBSTR, INSTR et NVL (pour les chaînes sans trait de soulignement), vous obtiendrez ce que vous voulez:

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

Résultat:

 output ------ ABC 

Utilisation:

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

Référence:

  • SUBSTR
  • INSTR

Addenda

Si vous utilisez Oracle10g +, vous pouvez utiliser regex via REGEXP_SUBSTR .

Cela peut être fait en utilisant facilement REGEXP_SUBSTR .

Veuillez utiliser

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

STRING_EXAMPLE est votre chaîne.

Essayer:

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

Cela résoudra votre problème.

Vous devez obtenir la position du premier trait de soulignement (en utilisant INSTR) puis obtenir la partie de la chaîne du 1er charecter au (pos-1) en utilisant substr.

  1 select 'ABC_blahblahblah' test_ssortingng, 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 

Documentation Instr

Documentation Susbtr

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

est la bonne réponse, telle que postée par user1717270

Si vous utilisez INSTR , cela vous donnera la position d’une chaîne supposant qu’il contient “_”. Et si ça ne marche pas? Eh bien, la réponse sera 0. Par conséquent, lorsque vous souhaitez imprimer la chaîne, elle affiche une NULL . Exemple: Si vous souhaitez supprimer le domaine d’un “host.domain”. Dans certains cas, vous n’aurez que le nom abrégé, c’est-à-dire “hôte”. Vous souhaitez probablement imprimer “host”. Eh bien, avec INSTR il vous donnera un NULL car il n’a pas trouvé de “.”, C’est-à-dire qu’il imprimera de 0 à 0. Avec REGEXP_SUBSTR vous obtiendrez la bonne réponse dans tous les cas:

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

HÔTE

et

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

HÔTE

Une autre possibilité serait l’utilisation de REGEXP_SUBSTR.

Rappelez-vous ceci si toutes les chaînes de la colonne n’ont pas de trait de soulignement (ou si la valeur nulle sera la sortie):

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

Pour trouver une sous-chaîne de grande chaîne:

 ssortingng_value:=('This is Ssortingng,Please search ssortingng 'Ple'); 

Ensuite, pour trouver la chaîne 'Ple' de Ssortingng_value nous pouvons faire comme:

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

Vous trouverez le résultat: Ple