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?
Si vous voulez lister les 3 derniers caractères, la manière la plus simple est
select substr('123456',-3) from dual;
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
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.
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! :)
substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)
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é :)
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)