Remover zeros à esquerda de um campo em uma instrução SQL


98

Estou trabalhando em uma consulta SQL que lê de um banco de dados SQLServer para produzir um arquivo de extração. Um dos requisitos para remover os zeros à esquerda de um campo específico, que é um VARCHAR(10)campo simples . Portanto, por exemplo, se o campo contém '00001A', a instrução SELECT precisa retornar os dados como '1A'.

Existe uma maneira no SQL de remover facilmente os zeros à esquerda dessa maneira? Eu sei que existe uma RTRIMfunção, mas isso parece apenas remover espaços.


3
Como um voto positivo para a resposta stackoverflow.com/a/11129399/1635441 de David Walker , consulte a resposta da Arvo postada: stackoverflow.com/a/662437/1635441
ramizmoh

Respostas:


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

8
Isso terá problemas quando a string for inteiramente composta por "0", pois nunca corresponderá a um caractere diferente de "0".
Cade Roux

Verdade. Ele retornará todas as sequências de zeros não modificadas neste caso. Se isso for um problema, o valor de retorno de patindex terá que ser testado em relação a zero.
Ian Horwill de

@Zapnologica: Não. Você teria que colocá-lo em uma instrução "update TableName set ColumnName = ...".
Ian Horwill

Claro, se você usar Update Statements.
Srivastav

1
Antes de usar esta solução, por favor, tente olhar para a resposta de Arvo postada aqui
OscarSosa

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

Recebi "Substituir função requer 3 argumentos." Eu acredito que deveria ler select replace (ltrim (replace (ColumnName, '0', '')), '', '0')
brentlightsey

5
Isso falhará se o valor tiver um espaço. Exemplo: "0001 B" deve se tornar "1 B", mas se tornará "10B".
Omaer

1
Como @Omaer mencionou, isso não é seguro se houver alguns espaços na string. Solução aprimorada - primeiro substitua os espaços por char que provavelmente não entrará na entrada e, após 0-ltrim, restaure esses caracteres de volta aos espaços depois. No final, parece bastante complexo :( Exemplo: selecione substituir (substituir (ltrim (substituir (substituir ('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)

retornos N0Z, isto é, eliminarão os zeros à esquerda e qualquer coisa que vier antes deles.


5
Como é um 0 inicial se algo vem antes dele?
xxbbcc

4

Eu tinha a mesma necessidade e usei isto:

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

3

Se você quiser que a consulta retorne um 0 em vez de uma string de zeros ou qualquer outro valor, você pode transformar isso em uma instrução case como esta:

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

2

Você pode usar isto:

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

0

Você pode tentar isso - é necessário um cuidado especial para remover apenas zeros à esquerda, se necessário:

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

Ou você pode simplesmente ligar

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

0

Aqui está a função de valor escalar SQL que remove zeros à esquerda da string:

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

Remover o 0 inicial do mês seguinte com certeza funcionará.

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

Basta substituir GETDATE()pelo campo de data de sua tabela.


3
Como exatamente isso responde à pergunta?
deutschZuid

-2

você pode tentar isso SELECT REPLACE(columnname,'0','') FROM table


3
Isso removerá 0 independentemente de sua posição. A pergunta é apenas sobre os líderes.
Domingo

-2

Para remover 0 à esquerda, você pode multiplicar a coluna de número por 1 Ex: Selecione (Nome da coluna * 1)


3
O que '1A' * 1 é igual?
Jonathan Rys

o que 10 * 1 será?
RATAN KUMAR

Foi afirmado na pergunta que o tipo de coluna é VARCHAR (10), portanto a multiplicação não é possível.
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 é um script Sql que emula a funcionalidade do comando TRIM em tsql antes de 2017, é basicamente o mesmo que as outras recomendações, mas as outras substituem por um único caractere incomum que ainda pode ocorrer, '[Rtrim]' ou '[ Ltrim] 'ainda poderia ocorrer no texto, mas substituir o chapéu por um texto único, por exemplo, um Guid resolveria esse problema.

Eu não testei em relação à velocidade


-3

Peguei emprestado das idéias acima. Isso não é rápido nem elegante. mas é preciso.

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 

FIM


Também não é dinâmico para permitir mais de 3 zeros.
JoeFletch

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

1
Você deve dar uma explicação com suas respostas, não apenas um único trecho de código. Além disso, formate o código como código (há um botão na parte superior da caixa de entrada de texto).
David Heyman

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

LTRIM
-----
45

Isso deve servir.


2
Não há sobrecarga para o servidor sql.
BillRob 01 de

No PostgreSQL é suficiente escrever select trim(leading '0' from '001A');, mas OP estava pedindo o SQL Server.
y434y
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.