web-dev-qa-db-fra.com

Utilisation de substr pour couper la chaîne sur Oracle

Je veux couper une chaîne à une longueur spécifiée. Si la chaîne est plus courte, je ne veux rien faire. J'ai trouvé une fonction substr () qui fait le travail. Cependant, il n'y a rien dans la documentation Oracle que se passe-t-il si la chaîne est plus courte que la longueur maximale.

Par exemple ceci:

select substr('abc',1,5) from dual;

renvoie "abc", ce dont j'ai besoin.

Je voudrais demander si cela est sûr, car la fonction ne semble pas être définie pour cette utilisation. Existe-t-il une meilleure façon de tronquer?

12
Michal

C'est tout à fait correct, mais si vous le souhaitez, vous pouvez utiliser cette requête:

select substr('abc',1,least(5,length('abc'))) from dual;
15
zaratustra

C'est une question intéressante. Étonnamment, la documentation ne semble pas couvrir ce point explicitement.

Je pense que ce que vous faites est assez sûr. substr() ne va pas "ajouter" de caractères à la fin de la chaîne lorsque la chaîne est trop courte. J'ai dépendu de ce comportement dans de nombreuses bases de données, y compris Oracle, au fil du temps. C'est ainsi que des fonctions similaires fonctionnent dans d'autres bases de données et dans la plupart des langues.

La seule sorte d'exception serait lorsque le type de données d'origine est un type char() plutôt que varchar2(). Dans ce cas, la fonction retournerait une chaîne du même type, elle pourrait donc être complétée par des espaces. Cependant, c'est une propriété du type pas vraiment de la fonction.

7
Gordon Linoff

Si vous voulez être absolument certain de ne pas vous retrouver avec des blancs de fin en utilisant SUBSTR seul (vous ne le ferez pas, mais parfois c'est réconfortant, soyez vraiment sûr), vous pouvez utiliser:

SELECT RTRIM(SUBSTR('abc',1,5)) FROM DUAL;

Partagez et profitez.

4
Bob Jarvis

Il est préférable d'utiliser la requête ci-dessous

SELECT SUBSTR('abc',1,LEAST(5,LENGTH('abc'))) FROM DUAL;

La requête ci-dessus prendrait soit la longueur de la chaîne, soit le nombre 5, la valeur la plus basse étant retenue.

4
Nishanthi Grashia