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.

Tim C
fuente
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)
Ian Horwill
fuente
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')
MTZ
fuente
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.

Nat
fuente
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
ekc
fuente
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
Kathryn Wilson
fuente
2

Puedes usar esto:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')
Stelian
fuente
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)) 
Shailendra Mishra
fuente
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
Vikas
fuente
-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.

Afzal
fuente
3
¿Cómo responde esto exactamente a la pregunta?
deutschZuid
-2

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

Madhurupa Moitra
fuente
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)

Krín
fuente
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

Tocino
fuente
-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

Brian Ellison
fuente
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
Lynn Caveny
fuente
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.

usuario3809240
fuente
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