padright padleft padl lpad string tsql

string - padleft - sql server zerofill



FunciĆ³n PadLeft en T-SQL (15)

Tengo la siguiente tabla A:

id ---- 1 2 12 123 1234

Necesito dejar los valores de id a la izquierda con cero:

id ---- 0001 0002 0012 0123 1234

¿Cómo puedo conseguir esto?


- Por favor mira esto.

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

- Espero que estos te ayuden


Algo bastante compatible con ODBC si es necesario podría ser el siguiente:

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

Esto se basa en el hecho de que la cantidad de dígitos para un número de base 10 puede ser encontrada por el componente integral de su registro. De esto podemos restarlo del ancho de relleno deseado. Repetir devolverá null para valores inferiores a 1, por lo que necesitamos ifnull .


Creé una función:

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;

Uso: seleccione dbo.fnPadLeft (123, 10)

Devoluciones: 0000000123


Crear función:

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

Ejemplo:

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


Creo que esto es lo que estás buscando:

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

o

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

No he probado la sintaxis en el segundo ejemplo. No estoy seguro de si eso funciona al 100%, puede requerir algunos ajustes, pero transmite la idea general de cómo obtener el resultado deseado.

EDITAR

Para abordar las preocupaciones enumeradas en los comentarios ...

@ pkr298 - Sí, STR solo funciona en números ... El campo OP es una ID ... por lo tanto, sólo es número.

@Desolator - Por supuesto que no funcionará ... el primer parámetro tiene 6 caracteres de largo. Puedes hacer algo como:

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

esto teóricamente debería mover los postes de la meta ... a medida que el número aumenta, SIEMPRE debería funcionar ... sin importar si es 1 o 123456789 ...

Entonces, si su valor máximo es 123456 ... verá 0000123456 y si su valor mínimo es 1, verá 0000000001


Esto es lo que normalmente uso cuando necesito rellenar un valor.

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


Esto funciona para cadenas, números enteros y numéricos:

SELECT CONCAT(REPLICATE(''0'', 4 - LEN(id)), id)

Donde 4 es la longitud deseada. Funciona para números con más de 4 dígitos, devuelve cadena vacía en valor NULL .


La forma más eficiente es:

Select id, LEN(id) From TableA Order by 2,1 The result : id ---- 1 2 12 123 1234


Mi solución no es eficiente pero me ayudó en una situación donde los valores (números de cheque bancario y transferencia de referencia ref.) Se almacenaron como varchar donde algunas entradas tenían valores alfanuméricos y tuve que rellenar si la longitud es menor que 6 caracteres.

Pensé compartir si alguien se encuentra con la misma situación

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


Necesitaba esto en una función en el servidor SQL y ajusté un poco la respuesta 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''


Prueba esto:

SELECT FORMAT(id,''0000'') FROM tableA


Prueba esto:

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


Publicación anterior, pero quizás esto ayude a alguien a salir:

Completar hasta que termine con 4 caracteres no blancos:

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

Para completar hasta 10:

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


SQL Server ahora admite la función FORMAT partir de la versión 2012, por lo que:

SELECT FORMAT(id, ''0000'') FROM TableA

hará el truco


declare @T table(id int) insert into @T values (1), (2), (12), (123), (1234) select right(''0000''+convert(varchar(4), id), 4) from @T

Resultado

---- 0001 0002 0012 0123 1234