Eliminar ceros a la izquierda de un campo en una declaración SQL


98

Estoy trabajando en una consulta SQL que lee de una base de datos SQLServer para producir un archivo de extracción. Uno de los requisitos para eliminar los ceros iniciales de un campo en particular, que es un VARCHAR(10)campo simple . Entonces, por ejemplo, si el campo contiene '00001A', la instrucción SELECT debe devolver los datos como '1A'.

¿Hay alguna forma en SQL de eliminar fácilmente los ceros iniciales de esta manera? Sé que hay una RTRIMfunción, pero parece que solo quita espacios.


3
Como un voto a favor de la respuesta de David Walker stackoverflow.com/a/11129399/1635441 , consulte la respuesta de Arvo publicada: stackoverflow.com/a/662437/1635441
ramizmoh

Respuestas:


151
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)

8
Esto tendrá problemas cuando la cadena esté completamente formada por "0", ya que nunca coincidirá con un carácter que no sea "0".
Cade Roux

Cierto. Devolverá toda la cadena de ceros sin modificar en este caso. Si esto es un problema, el valor de retorno de patindex deberá probarse con cero.
Ian Horwill

@Zapnologica: No. Tendría que ponerlo en una declaración "update TableName set ColumnName = ...".
Ian Horwill

Claro, si usa Update Statements.
Srivastav

1
Antes de usar esta solución, intente ver la respuesta de Arvo publicada aquí
OscarSosa

26
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')

Recibí "La función Reemplazar requiere 3 argumentos". Creo que debería leer select replace (ltrim (replace (ColumnName, '0', '')), '', '0')
brentlightsey

5
Esto fallará si el valor tiene un espacio. Ejemplo: "0001 B" debería convertirse en "1 B", pero en su lugar se convertirá en "10B".
Omaer

1
Como mencionó @Omaer, esto no es seguro si hay algunos espacios en la cadena. Solución mejorada: primero reemplace los espacios con caracteres que es poco probable que entren en la entrada y, después de 0-ltrim, restaure estos caracteres a los espacios posteriores. Al final parece bastante complejo :( Ejemplo: seleccione reemplazar (reemplazar (ltrim (reemplazar (reemplazar ('000309933200,00 USD', '', '|'), '0', '')), '', '0 '),' | ',' ') -> 309933200,00 USD
Robert Lujo

4
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20)

devuelve N0Z, es decir, eliminará los ceros iniciales y todo lo que venga antes de ellos.


5
¿Cómo es un 0 inicial si algo viene antes?
xxbbcc

4

Tenía la misma necesidad y usé esto:

select 
    case 
        when left(column,1) = '0' 
        then right(column, (len(column)-1)) 
        else column 
      end

3

Si desea que la consulta devuelva un 0 en lugar de una cadena de ceros o cualquier otro valor, puede convertir esto en una declaración de caso como esta:

select CASE
      WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
       THEN '0'
      ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
      END

2

Puedes usar esto:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')

0

Puede probar esto; se necesita especial cuidado para eliminar solo los ceros iniciales si es necesario:

DECLARE @LeadingZeros    VARCHAR(10) ='-000987000'

SET @LeadingZeros =
      CASE WHEN PATINDEX('%-0', @LeadingZeros) = 1   THEN 
           @LeadingZeros
      ELSE 
           CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 
      END   

SELECT @LeadingZeros

O simplemente puede llamar

CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 

0

Aquí está la función de valor escalar SQL que elimina los ceros iniciales de la cadena:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Vikas Patel
-- Create date: 01/31/2019
-- Description: Remove leading zeros from string
-- =============================================
CREATE FUNCTION dbo.funRemoveLeadingZeros 
(
    -- Add the parameters for the function here
    @Input varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Result varchar(max)

    -- Add the T-SQL statements to compute the return value here
    SET @Result = @Input

    WHILE LEFT(@Result, 1) = '0'
    BEGIN
        SET @Result = SUBSTRING(@Result, 2, LEN(@Result) - 1)
    END

    -- Return the result of the function
    RETURN @Result

END
GO


-1

Eliminar el 0 a la izquierda de la declaración del mes siguiente definitivamente funcionará.

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

Simplemente reemplácelo GETDATE()con el campo de fecha de su tabla.


3
¿Cómo responde esto exactamente a la pregunta?
deutschZuid

-2

puedes probar esto SELECT REPLACE(columnname,'0','') FROM table


3
Esto eliminará 0 independientemente de su posición. La pregunta se refiere solo a los principales.
Domingo

-2

Para eliminar el 0 inicial , puede multiplicar la columna numérica con 1 Por ejemplo: Seleccione (ColumnName * 1)


3
¿A qué equivale '1A' * 1?
Jonathan Rys

¿Qué será 10 * 1?
RATAN KUMAR

En la pregunta se indicó que el tipo de columna es VARCHAR (10), por lo que no es posible multiplicar.
y434y

-2
select replace(replace(rtrim(replace(replace(replace(replace(ltrim(replace(replace([COLUMN],' ','[Ltrim]'),[Ltrim],' ')),' ',[Ltrim]),'[Ltrim]',' '),' ','[Rtrim]'),[Rtrim],' ')),' ',[Rtrim]),'[Rtrim]',' ') As Result

Este es un script Sql que emula la funcionalidad del comando TRIM en tsql antes de 2017, es básicamente lo mismo que las otras recomendaciones, pero las otras se reemplazan con un único carácter poco común que aún puede ocurrir, '[Rtrim]' o '[ Ltrim] 'aún podría aparecer en el texto, pero reemplazar hat con un texto único, por ejemplo, un Guid resolvería ese problema.

no lo he probado con respecto a la velocidad


-3

Tomé prestado de las ideas anteriores. Esto no es rápido ni elegante. pero es exacto.

CASO

WHEN left(column, 3) = '000' THEN right(column, (len(column)-3))

WHEN left(column, 2) = '00' THEN right(a.column, (len(column)-2))

WHEN left(column, 1) = '0' THEN right(a.column, (len(column)-1))

ELSE 

FINAL


Tampoco es dinámico permitir más de 3 ceros.
JoeFletch

-3
select CASE
         WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
           THEN ''
           ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
       END

1
Debe dar una explicación con sus respuestas, no solo un fragmento de código. Además, formatee el código como código (hay un botón en la parte superior del cuadro de entrada de texto).
David Heyman

-4
select ltrim('000045', '0') from dual;

LTRIM
-----
45

Esto debería bastar.


2
No hay sobrecarga para el servidor SQL.
BillRob

En PostgreSQL es suficiente escribir select trim(leading '0' from '001A');, pero OP estaba solicitando SQL Server.
y434y
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.