web-dev-qa-db-fra.com

Fonction PadLeft dans T-SQL

J'ai le tableau suivant A:

id
----
1
2
12
123
1234

J'ai besoin d'insérer à gauche les valeurs id avec des zéros:

id
----
0001
0002
0012
0123
1234

Comment puis-je atteindre cet objectif?

96
Gali

Je crois que c'est peut-être ce que vous cherchez:

SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 

FROM tableA

ou

SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]

FROM tableA

Je n'ai pas testé la syntaxe sur le 2ème exemple. Je ne sais pas si cela fonctionne à 100% - cela peut nécessiter quelques ajustements -, mais cela donne une idée générale de la façon d'obtenir le résultat souhaité.

MODIFIER

Pour répondre aux préoccupations énumérées dans les commentaires ... 

@ pkr298 - Oui STR ne fonctionne que sur les nombres ... Le champ de l'OP est un ID ... et donc un numéro uniquement.

@Desolator - Bien sûr, cela ne fonctionnera pas ... le premier paramètre est composé de 6 caractères. Vous pouvez faire quelque chose comme:

SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA

cela devrait théoriquement déplacer les poteaux de but ... lorsque le nombre augmente, il devrait TOUJOURS fonctionner ... peu importe si son 1 ou 123456789 ...

Donc, si votre valeur maximale est 123456 ... vous verriez 0000123456 et si votre valeur minimale est 1, vous verriez 0000000001

182
Patrick
declare @T table(id int)
insert into @T values
(1),
(2),
(12),
(123),
(1234)

select right('0000'+convert(varchar(4), id), 4)
from @T

Résultat

----
0001
0002
0012
0123
1234
54
Mikael Eriksson

SQL Server prend désormais en charge la fonction FORMAT à partir de la version 2012, donc:

SELECT FORMAT(id, '0000') FROM TableA

fera l'affaire. 

Si votre identifiant ou votre colonne est dans une varchar et représente un nombre que vous convertissez en premier:

SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
44
CrimsonKing

Ancien post, mais peut-être que cela aide quelqu'un:

Pour terminer jusqu'à ce qu'il se termine avec 4 caractères non vierges:

SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;

A compléter jusqu'à 10h:

SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;
31
Marcelo Myara

Essaye ça:

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]
12
aporia

- S'il vous plaît examiner ces.

select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');

- J'espère que cela vous aiderait

8
Mr.Wimol Prommajorm

C’est ce que j’utilise normalement lorsque j’ai besoin de remplir une valeur.

SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)
2
KenB

Créer une fonction:

    Create FUNCTION [dbo].[PadLeft]
      (
        @Text NVARCHAR(MAX) ,
        @Replace NVARCHAR(MAX) ,
        @Len INT
      )
RETURNS NVARCHAR(MAX)
AS
    BEGIN 


        DECLARE @var NVARCHAR(MAX) 

        SELECT @var = ISNULL(LTRIM(RTRIM(@Text)) , '')


        RETURN   RIGHT(REPLICATE(@Replace,@Len)+ @var, @Len)


    END

Exemple:

Select dbo.PadLeft('123456','0',8)
1
mehrdad

J'avais besoin de cela dans une fonction sur un serveur SQL et ajusté un peu la réponse de Patrick.

declare @dossierId int = 123
declare @padded_id varchar(7)


set @padded_id = REPLACE(
              SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId), 
              SPACE(1),  
              '0') 

SELECT @dossierId as '@dossierId'
      ,SPACE(LEN(@dossierId)) + convert(varchar(7)
      ,@dossierId) as withSpaces
      ,@padded_id as '@padded_id'
1
Bob Lokerse

J'ai créé une fonction:

CREATE FUNCTION [dbo].[fnPadLeft](@int int, @Length tinyint)
RETURNS varchar(255) 
AS 
BEGIN
    DECLARE @strInt varchar(255)

    SET @strInt = CAST(@int as varchar(255))
    RETURN (REPLICATE('0', (@Length - LEN(@strInt))) + @strInt);
END;

Utilisation: sélectionnez dbo.fnPadLeft (123, 10)

Retours: 0000000123

1
Anne Lord

Ma solution n’est pas efficace, mais m’a aidé dans les situations où les valeurs (numéros de chèques bancaires et numéros de virement) étaient stockées sous forme de varchar où certaines entrées comportaient des valeurs alphanumériques et que je devais compléter si la longueur est inférieure à 6 caractères.

Pensé à partager si quelqu'un rencontre la même situation

declare @minlen int = 6
declare @str varchar(20)

set @str = '123'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 000123

set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 001234

set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789


set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: NEFT 123456789
0
Tejasvi Hegde

Un exemple simple serait

    DECLARE @number INTEGER
    DECLARE @length INTEGER
    DECLARE @char   NVARCHAR(10)
    SET @number = 1
    SET @length = 5
    SET @char = '0'

    SELECT FORMAT(@number, replicate(@char, @length))
0
Jonathan Santiago

Quelque chose d'assez conforme ODBC si nécessaire peut être le suivant:

select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
        + cast (FIELD as varchar(10))
  from TABLE_NAME

Ceci est basé sur le fait que la quantité de chiffres pour un nombre base 10 peut être trouvée par la composante intégrale de son journal. De cela, nous pouvons le soustraire de la largeur de remplissage souhaitée. Répéter retournera null pour les valeurs inférieures à 1, nous avons donc besoin de ifnull.

0
Brett Ryan