web-dev-qa-db-fra.com

Comment obtenir les 10 places les plus à droite d'une chaîne dans Oracle

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

20
tismon

Vous pouvez utiliser SUBSTR fonction comme:

select substr('TN0001234567890345',-10) from dual;

Sortie:

4567890345
37
codaddict

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;
2
Briguy37

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

1
user3496712

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.

0
Gary_W