Rimozione degli zeri iniziali da un campo in un'istruzione SQL


98

Sto lavorando su una query SQL che legge da un database SQLServer per produrre un file di estrazione. Uno dei requisiti per rimuovere gli zeri iniziali da un campo particolare, che è un VARCHAR(10)campo semplice . Quindi, ad esempio, se il campo contiene "00001A", l'istruzione SELECT deve restituire i dati come "1A".

C'è un modo in SQL per rimuovere facilmente gli zeri iniziali in questo modo? So che esiste una RTRIMfunzione, ma sembra solo rimuovere gli spazi.


3
Come un upvote per David Walker stackoverflow.com/a/11129399/1635441 risposta, si prega di fare riferimento alla risposta di Arvo Inviato: stackoverflow.com/a/662437/1635441
ramizmoh

Risposte:


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

8
Ciò avrà problemi quando la stringa è interamente composta da "0", poiché non corrisponderà mai a un carattere diverso da "0".
Cade Roux

Vero. In questo caso, restituirà tutta la stringa di zeri non modificata. Se questo è un problema, il valore di ritorno di patindex dovrà essere verificato rispetto a zero.
Ian Horwill

@Zapnologica: No. Dovresti metterlo in un'istruzione "update TableName set ColumnName = ...".
Ian Horwill

Certo, se usi le dichiarazioni di aggiornamento.
Srivastav

1
Prima di utilizzare questa soluzione, prova a esaminare la risposta di Arvo pubblicata qui
OscarSosa

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

Ho ricevuto "La funzione di sostituzione richiede 3 argomenti". Credo che dovrebbe leggere select replace (ltrim (replace (ColumnName, '0', '')), '', '0')
brentlightsey

5
Questo fallirà se il valore contiene uno spazio. Esempio: "0001 B" dovrebbe diventare "1 B" ma diventerà invece "10B".
Omaer

1
Come menzionato da @Omaer, questo non è sicuro se ci sono degli spazi nella stringa. Soluzione migliorata: prima sostituisci gli spazi con char che è improbabile che entri in input e, dopo 0-ltrim, ripristina questi caratteri negli spazi successivi. Alla fine sembra piuttosto complesso :( Esempio: selezionare sostituire (sostituire (ltrim (sostituire (sostituire ('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)

ritorni N0Z, cioè, eliminerà gli zeri iniziali e tutto ciò che viene prima di loro.


5
Com'è uno 0 iniziale se qualcosa viene prima di esso?
xxbbcc

4

Avevo la stessa esigenza e ho usato questo:

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

3

Se vuoi che la query restituisca uno 0 invece di una stringa di zeri o qualsiasi altro valore, puoi trasformarlo in un'istruzione case come questa:

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

2

Puoi usare questo:

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

0

Si può provare questo - si prende cura speciale per solo rimuovere zeri, se necessario:

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

Oppure puoi semplicemente chiamare

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

0

Ecco la funzione del valore scalare SQL che rimuove gli zeri iniziali dalla stringa:

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

Per rimuovere lo 0 iniziale dal mese successivo all'istruzione funzionerà sicuramente.

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

Sostituisci semplicemente GETDATE()con il campo della data della tua tabella.


3
Come risponde esattamente questo alla domanda?
deutschZuid

-2

puoi provare questo SELECT REPLACE(columnname,'0','') FROM table


3
Questo rimuoverà 0 indipendentemente dalla sua posizione. La domanda sta chiedendo solo quelli principali.
Sunil

-2

Per rimuovere lo 0 iniziale, puoi moltiplicare la colonna del numero per 1 Ad esempio: Seleziona (ColumnName * 1)


3
Cosa significa "1A" * 1?
Jonathan Rys

cosa sarà 10 * 1?
RATAN KUMAR

Nella domanda è stato affermato che il tipo di colonna è VARCHAR (10), quindi la moltiplicazione non è possibile.
y434y

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

Questo è uno script Sql che emula la funzionalità del comando TRIM in tsql prima del 2017, è fondamentalmente uguale alle altre raccomandazioni, ma gli altri vengono sostituiti con un singolo carattere non comune che può ancora verificarsi, "[Rtrim]" o "[ Ltrim] 'potrebbe ancora verificarsi nel testo, ma sostituire hat con un testo univoco, ad esempio un Guid, risolverebbe il problema.

non l'ho testato per quanto riguarda la velocità


-3

Ho preso in prestito dalle idee sopra. Questo non è né veloce né elegante. ma è accurato.

ASTUCCIO

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 

FINE


Inoltre, non è dinamico consentire più di 3 zeri.
JoeFletch

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

1
Dovresti fornire una spiegazione con le tue risposte, non solo un singolo frammento di codice. Inoltre, formatta il codice come codice (c'è un pulsante nella parte superiore della casella di immissione del testo).
David Heyman,

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

LTRIM
-----
45

Questo dovrebbe bastare.


2
Non c'è sovraccarico per SQL Server.
BillRob

In PostgreSQL è sufficiente scrivere select trim(leading '0' from '001A');, ma OP richiedeva SQL Server.
y434y
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.