111 votes

Suppression des zéros initiaux d'un champ dans une instruction SQL

Je travaille sur une requête SQL qui lit à partir d'une base de données SQL Server pour produire un fichier d'extraction. L'une des exigences est de supprimer les zéros de tête d'un champ particulier, qui est un champ VARCHAR(10) simple. Donc, par exemple, si le champ contient '00001A', l'instruction SELECT doit renvoyer les données sous forme de '1A'.

Y a-t-il un moyen en SQL de supprimer facilement les zéros de tête de cette manière? Je sais qu'il existe une fonction RTRIM, mais cela semble ne supprimer que les espaces.

3 votes

Comme un pouce en l'air à la réponse de David Walker sur stackoverflow.com/a/11129399/1635441, veuillez vous référer à la réponse d'Arvo publiée : stackoverflow.com/a/662437/1635441

169voto

Ian Horwill Points 1168
sélectionner sous-chaîne(NomColonne, patindex('%[^0]%',NomColonne), 10)

9 votes

Cela posera des problèmes lorsque la chaîne est entièrement composée de "0", car elle ne correspondra jamais à un caractère non-"0".

0 votes

Vrai. Il retournera ici toute la chaîne de zéros non modifiée. Si cela pose un problème, il faudra tester la valeur de retour de patindex contre zéro.

0 votes

@Zapnologica: Non. Vous devriez le mettre dans une instruction "update TableName set ColumnName = ...".

35voto

MTZ Points 61
sélectionner remplacer(ltrim(replace(NomColonne,'0',' ')),' ','0')

0 votes

J'ai reçu "La fonction Remplacer nécessite 3 arguments." Je crois qu'il devrait être lu select remplacer(ltrim(remplacer(NomColonne, '0', ' ')),' ','0')

8 votes

Cela échouera si la valeur contient un espace. Exemple: "0001 B" devrait devenir "1 B" mais deviendra plutôt "10B".

3 votes

Comme l'a mentionné @Omaer, ceci n'est pas sûr s'il y a des espaces dans la chaîne. Solution améliorée - d'abord remplacer les espaces par un caractère qui a peu de chances d'apparaître dans l'entrée, puis 0-ltrim, rétablir ces caractères en espaces après. À la fin, ça a l'air assez compliqué :( Exemple: select replace(replace(ltrim(replace(replace('000309933200,00 USD', ' ', '|'),'0',' ')),' ','0'), '|', ' ') --> 309933200,00 USD

5voto

Nat Points 11
sélectionnez sous-chaîne(sous-chaîne('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',sous-chaîne('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20)

retourne N0Z, c'est-à-dire, supprimera les zéros initiaux et tout ce qui les précède.

7 votes

Comment est-ce un 0 de tête si quelque chose vient avant?

3voto

Kathryn Wilson Points 11

Si vous souhaitez que la requête renvoie un 0 au lieu d'une chaîne de zéros ou de toute autre valeur, vous pouvez transformer cela en une instruction CASE comme ceci:

select CASE
      WHEN NomDeLaColonne = sous-chaîne(NomDeLaColonne, patindex('%[^0]%', NomDeLaColonne), 10) 
       THEN '0'
      ELSE sous-chaîne(NomDeLaColonne, patindex('%[^0]%', NomDeLaColonne), 10) 
      END

-1voto

Afzal Points 1

Pour supprimer le 0 initial du mois suivant l'instruction suivante fonctionnera certainement.

SELECT replace(left(Convert(nvarchar,GETDATE(),101),2),'0','')+RIGHT(Convert(nvarchar,GETDATE(),101),8) 

Remplacez simplement GETDATE() par le champ de date de votre Table.

3 votes

Comment exactement cela répond-il à la question?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X