SQL deyimindeki bir alandan baştaki sıfırları kaldırma


100

Bir ayıklama dosyası oluşturmak için SQLServer veritabanından okuyan bir SQL sorgusu üzerinde çalışıyorum. Baştaki sıfırları belirli bir alandan kaldırmak için gereksinimlerden biri, bu basit bir VARCHAR(10)alandır. Bu nedenle, örneğin, alan "00001A" içeriyorsa, SELECT ifadesinin verileri "1A" olarak döndürmesi gerekir.

SQL'de baştaki sıfırları bu şekilde kolayca kaldırmanın bir yolu var mı? Bir RTRIMişlev olduğunu biliyorum , ancak bu yalnızca boşlukları kaldırıyor gibi görünüyor.


3
David Walker'ın stackoverflow.com/a/11129399/1635441 yanıtına ek olarak, lütfen
Arvo'nun

Yanıtlar:


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

8
Bu, dizge tamamen "0" dan oluştuğunda sorunlara neden olacaktır, çünkü hiçbir zaman "0" olmayan bir karakterle eşleşmeyecektir.
Cade Roux

Doğru. Bu durumda, tüm değiştirilmemiş sıfır dizisini döndürecektir. Bu bir sorunsa, patindex'in dönüş değeri sıfıra karşı test edilmelidir.
Ian Horwill

@Zapnologica: Hayır. Bunu bir "güncelleştirme TableName set ColumnName = ..." ifadesine koymanız gerekir.
Ian Horwill

Elbette, Güncelleme İfadeleri kullanıyorsanız.
Srivastav

2
Bu çözümü kullanmadan önce, lütfen
Arvo'nun

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

"Değiştir işlevi 3 bağımsız değişken gerektirir" mesajını aldım. Seçin değiştir (ltrim ((ColumnName, '0', '')), '', '0')
okuması gerektiğine inanıyorum

5
Değerin içinde boşluk varsa bu başarısız olur. Örnek: "0001 B", "1 B" olmalı, ancak bunun yerine "10B" olacaktır.
Omaer

1
@Omaer'in bahsettiği gibi, dizede bazı boşluklar varsa bu güvenli değildir. İyileştirilmiş çözüm - önce boşlukları girdi girmesi olası olmayan karakterlerle değiştirin ve 0-ltrim'den sonra bu karakterleri daha sonra boşluklara geri yükleyin. Sonunda oldukça karmaşık görünüyor :( Örnek: replace (replace (ltrim (replace ('000309933200,00 USD', '', '|'), '0', '')), '', '0 '),' | ',' ') -> 309933200,00 USD
Robert Lujo

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

dönüşler N0Z, yani baştaki sıfırlardan ve onlardan önce gelen her şeyden kurtulacaktır.


5
Ondan önce bir şey gelirse, nasıl önde gelen 0 olur?
xxbbcc

4

Aynı ihtiyacım vardı ve bunu kullandım:

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

3

Sorgunun bir sıfır dizesi veya bu konuda başka herhangi bir değer yerine 0 döndürmesini istiyorsanız, bunu aşağıdaki gibi bir case ifadesine dönüştürebilirsiniz:

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

2

Bunu kullanabilirsiniz:

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

0

Bunu deneyebilirsiniz - yalnızca gerektiğinde baştaki sıfırları kaldırmak için özel bir özen gerekir:

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

Ya da sadece arayabilirsin

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

0

Baştaki sıfırları dizeden kaldıran SQL skaler değer işlevi:

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

Baştaki 0'ı aydan kaldırmak için aşağıdaki ifade kesinlikle işe yarayacaktır.

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

Tablonuzun GETDATE()tarih alanıyla değiştirin .


3
Bu soruya tam olarak nasıl cevap veriyor?
deutschZuid

-2

bunu deneyebilirsin SELECT REPLACE(columnname,'0','') FROM table


3
Bu, konumuna bakılmaksızın 0'ı kaldıracaktır. Soru sadece liderleri sormaktır.
Sunil

-2

Baştaki 0'ı kaldırmak için, sayı sütununu 1 ile çarpabilirsiniz Örneğin: Seç (SütunAdı * 1)


3
'1A' * 1 neye eşittir?
Jonathan Rys

10 * 1 ne olacak?
RATAN KUMAR

Soruda sütun tipinin VARCHAR (10) olduğu, dolayısıyla çarpmanın mümkün olmadığı belirtildi.
y434y

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

Bu, 2017'den önce tsql'deki TRIM komutunun işlevselliğini taklit eden bir Sql betiğidir, temelde diğer önerilerle aynıdır, ancak diğerleri hala oluşabilen tek bir yaygın olmayan karakterle değiştirilir, '[Rtrim]' veya '[ Ltrim] 'yine de metinde geçebilir, ancak şapkayı benzersiz bir metinle değiştirmek, örneğin bir Kılavuz bu sorunu çözecektir.

hız konusunda test etmedim


-3

Yukarıdaki fikirlerden ödünç aldım. Bu ne hızlı ne de zariftir. ama doğru.

DURUM

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 

SON


Ayrıca 3'ten fazla sıfıra izin vermek dinamik değildir.
JoeFletch

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

1
Tek bir kod parçacığı değil, yanıtlarınızla açıklama yapmalısınız. Ayrıca, lütfen kodu kod olarak biçimlendirin (metin giriş kutusunun üstünde bir düğme vardır).
Vivian

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

LTRIM
-----
45

Bu yapmalı.


2
Sql server için aşırı yükleme yoktur.
BillRob

PostgreSQL'de yazmak için yeterli select trim(leading '0' from '001A');, ancak OP SQL Server istiyordu.
y434y
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.