web-dev-qa-db-fra.com

obtenir la chaîne du côté droit

J'écris une requête dans Oracle.

Je veux obtenir une chaîne du côté droit mais la longueur de la chaîne est dynamique.

Ex:

299123456789

Je veux obtenir 123456789

substr(PHONE_NUMBERS,-X,Y)

X est différent pour chaque enregistrement.

J'ai essayé ceci:

substr(PHONE_NUMBERS,-length(PHONE_NUMBERS),Y)

et ça n'a pas marché ..

Comment puis-je écrire cette requête?

20
Jack

Si vous voulez lister les 3 derniers caractères, la manière la plus simple est

 select substr('123456',-3) from dual;
41
Sanjay Kattimani
SQL> select substr('123456',-1,6) from dual;

S
-
6

SQL> select substr('123456',-6,6) from dual;

SUBSTR
------
123456

SQL> select substr('123456',-7,6) from dual;

S
-

Si vous regardez les instructions ci-dessus, la requête 3 donne une valeur nulle sous la forme -7> longueur ('123456').

Vérifiez donc la longueur de CONT_PHONE_NUMBERS et PHONE_NUMBERS

J'espère que cela vous aide

16
Bharat
SQL> select substr('999123456789', greatest (-9, -length('999123456789')), 9) as value from dual;

VALUE
---------
123456789

SQL> select substr('12345', greatest (-9,  -length('12345')), 9) as value from dual;

VALUE
----
12345

L'appel à greatest (-9, -length(string)) limite le décalage de départ soit 9 caractères à gauche de la fin ou le début de la chaîne.

7
Adam Musch

Je viens de découvrir que regexp_substr() est parfait à cet effet :)

Mon défi consiste à choisir les 16 caractères de droite dans une chaîne de référence qui peut théoriquement être de 7 à 250 caractères. Cela m'énerve que substr( OurReference , -16 ) renvoie null lorsque length( OurReference ) < 16. (D'un autre côté, il est également logique qu'Oracle renvoie par conséquent null chaque fois qu'un appel à substr() dépasse les limites d'une chaîne.) Cependant, je peux définir une expression régulière pour reconnaître tout entre 1 et 16 de tout caractère juste avant la fin de la chaîne:

regexp_substr( OurReference , '.{1,16}$' )

En ce qui concerne les problèmes de performances concernant les expressions régulières, je ne peux pas dire laquelle de la solution GREATER() et celle-ci fonctionne le mieux. Quelqu'un teste-t-il cela? En général, j'ai expérimenté que les expressions régulières sont assez rapides si elles sont bien écrites (comme celle-ci).

Bonne chance! :)

4
TF Krog
substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)
3
Joe User

le motif ressemble peut-être à ceci:

substr(STRING, ( length(STRING) - (TOTAL_GET_LENGTH - 1) ),TOTAL_GET_LENGTH)

dans votre cas, il aimera ceci:

substr('299123456789', (length('299123456789')-(9 - 1)),9)

substr('299123456789', (12-8),9)

substr('299123456789', 4,9)

the result ? of course '123456789'

la longueur est dynamique, le tour est joué :)

2
SELECT SUBSTR('299123456789',DECODE(least(LENGTH('299123456789'),9),9,-9,LENGTH('299123456789')*-1)) value from dual  

Donne 123456789

La même déclaration fonctionne même lorsque le nombre est inférieur à 9 chiffres:

SELECT SUBSTR('6789',DECODE(least(LENGTH('6789'),9),9,-9,LENGTH('6789')*-1)) value from dual  

Donne 6789

J'ai eu le même problème. Cela a fonctionné pour moi:

 CASE WHEN length(sp.tele_phone_number) = 10 THEN
                   SUBSTR(sp.tele_phone_number,4)
0
Clayton