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