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.

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

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

Você pode usar isto:

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

Caso você queira remover os zeros iniciais de uma string de tamanho desconhecido.

Você pode considerar o uso do comando STUFF.

Aqui está um exemplo de como isso funcionaria.

SELECT ISNULL(STUFF(ColumnName
                   ,1
                   ,patindex('%[^0]%',ColumnName)-1
                   ,'')
             ,REPLACE(ColumnName,'0','')
             )

Veja no violinista vários cenários que ele cobrirá

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=14c2dca84aa28f2a7a1fac59c9412d48

Frank Chen
fonte
-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.

Afzal
fonte
3
Como exatamente isso responde à pergunta?
deutschZuid
-2

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

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

Krin
fonte
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

Bacon
fonte
-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

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

user3809240
fonte
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