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
output ------ ABC
SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output FROM YOUR_TABLE t
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)
où 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