J'essaie d'extraire un identifiant d'une table Oracle. C'est quelque chose comme TN0001234567890345
. Ce que je veux, c'est trier les valeurs en fonction des 10 positions les plus à droite (par exemple 4567890345
). J'utilise Oracle 11g. Existe-t-il une fonction permettant de supprimer les 10 positions les plus à droite dans Oracle SQL?
Merci d'avance
tismon
Vous pouvez utiliser SUBSTR fonction comme:
select substr('TN0001234567890345',-10) from dual;
Sortie:
4567890345
la solution de codaddict fonctionne si votre chaîne est connue pour être au moins aussi longue que la longueur à laquelle elle doit être rognée. Toutefois, si vous pouviez avoir des chaînes plus courtes (par exemple, le rognage aux 10 derniers caractères et l’une des chaînes à rogner est 'abc'), la valeur renvoyée est null, ce qui n’est probablement pas ce que vous voulez.
Voici donc la version légèrement modifiée qui prendra les 10 caractères les plus à droite quelle que soit leur longueur tant qu'ils sont présents:
select substr(colName, -least(length(colName), 10)) from tableName;
Une autre façon de le faire, bien que plus fastidieuse. Utilisez les fonctions REVERSE
et SUBSTR
comme indiqué ci-dessous:
SELECT REVERSE(SUBSTR(REVERSE('TN0001234567890345'), 1, 10)) FROM DUAL;
La première fonction REVERSE renverra la chaîne 5430987654321000NT
.
La fonction SUBSTR
lira notre nouvelle chaîne 5430987654321000NT
du premier au dixième caractère, ce qui donnera 5430987654.
La dernière fonction REVERSE
renverra notre chaîne d'origine moins les 8 premiers caractères, c'est-à-dire 4567890345
Oui, ceci est un ancien post, mais il est apparu dans la liste à cause de quelqu'un qui l'a édité pour une raison quelconque et j'ai été choqué qu'une solution d'expression régulière n'ait pas été incluse! Voici donc une solution utilisant regex_substr dans la clause order by pour un exercice futile. L'expression régulière examine les 10 derniers caractères de la chaîne:
with tbl(str) as (
select 'TN0001239567890345' from dual union
select 'TN0001234567890345' from dual
)
select str
from tbl
order by to_number(regexp_substr(str, '.{10}$'));
On suppose que la partie ID de la chaîne comporte au moins 10 chiffres.