Menghapus nol di depan dari bidang dalam pernyataan SQL

98

Saya sedang mengerjakan kueri SQL yang membaca dari database SQLServer untuk menghasilkan file ekstrak. Salah satu syarat untuk menghilangkan angka nol terdepan dari bidang tertentu, yaitu VARCHAR(10)bidang sederhana . Jadi, misalnya, jika bidang berisi '00001A', pernyataan SELECT perlu mengembalikan data sebagai '1A'.

Apakah ada cara dalam SQL untuk dengan mudah menghapus angka nol di depan dengan cara ini? Saya tahu ada RTRIMfungsi, tapi ini sepertinya hanya untuk menghilangkan spasi.

Tim C
sumber
3
Sebagai upvote untuk tanggapan stackoverflow.com/a/11129399/1635441 David Walker , lihat jawaban Arvo yang diposting: stackoverflow.com/a/662437/1635441
ramizmoh

Jawaban:

151
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
Ian Horwill
sumber
8
Ini akan mengalami masalah saat string seluruhnya terdiri dari "0", karena tidak akan pernah cocok dengan karakter non- "0".
Cade Roux
Benar. Ini akan mengembalikan semua string nol yang tidak dimodifikasi dalam kasus ini. Jika ini menjadi masalah, nilai kembalian patindex harus diuji terhadap nol.
Ian Horwill
@Zapnologica: Tidak. Anda harus memasukkannya ke dalam pernyataan "update TableName set ColumnName = ...".
Ian Horwill
Tentu, jika Anda menggunakan Pernyataan Pembaruan.
Srivastav
1
Sebelum menggunakan solusi ini, coba lihat jawaban Arvo yang diposting di sini
OscarSosa
26
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
MTZ
sumber
Saya menerima "Fungsi ganti membutuhkan 3 argumen." Saya percaya itu harus membaca pilih ganti (ltrim (ganti (ColumnName, '0', '')), '', '0')
brentlightsey
5
Ini akan gagal jika nilainya memiliki spasi di dalamnya. Contoh: "0001 B" seharusnya menjadi "1 B" tetapi akan menjadi "10B".
Omaer
1
Seperti yang disebutkan @Omaer, ini tidak aman jika ada beberapa spasi dalam string. Solusi yang ditingkatkan - pertama-tama ganti spasi dengan karakter yang kemungkinan tidak akan masuk, dan setelah 0-ltrim, pulihkan karakter ini ke spasi setelahnya. Pada akhirnya terlihat cukup rumit :( Contoh: pilih ganti (ganti (ltrim (ganti (ganti ('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)

pengembalian N0Z, yaitu, akan menyingkirkan nol di depan dan apa pun yang muncul sebelum mereka.

Nat
sumber
5
Bagaimana bisa menjadi 0 terdepan jika ada sesuatu yang datang sebelumnya?
xxbbcc
4

Saya memiliki kebutuhan yang sama dan menggunakan ini:

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

Jika Anda ingin kueri mengembalikan 0 alih-alih string nol atau nilai lain dalam hal ini, Anda dapat mengubahnya menjadi pernyataan kasus seperti ini:

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

Anda dapat menggunakan ini:

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

Anda dapat mencoba ini - perlu perhatian khusus untuk hanya menghapus angka nol di depan jika diperlukan:

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

Atau Anda bisa menelepon

CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 
Shailendra Mishra
sumber
0

Berikut adalah fungsi nilai skalar SQL yang menghapus nol di depan dari 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
sumber
0

Jika Anda ingin menghapus angka nol di depan dari string dengan ukuran yang tidak diketahui.

Anda dapat mempertimbangkan untuk menggunakan perintah STUFF.

Berikut adalah contoh cara kerjanya.

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

Lihat di fiddler berbagai skenario yang akan dibahasnya

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

Frank Chen
sumber
-1

Untuk menghapus 0 di depan dari pernyataan bulan berikutnya pasti akan berhasil.

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

Ganti saja GETDATE()dengan bidang tanggal di Tabel Anda.

Afzal
sumber
3
Bagaimana tepatnya ini menjawab pertanyaan itu?
deutschZuid
-2

kamu bisa mencoba ini SELECT REPLACE(columnname,'0','') FROM table

Madhurupa Moitra
sumber
3
Ini akan menghapus 0 terlepas dari posisinya. Pertanyaan menanyakan tentang hanya yang memimpin.
Sunil
-2

Untuk menghilangkan awalan 0, Anda dapat mengalikan kolom angka dengan 1 Misal: Select (ColumnName * 1)

Krin
sumber
3
Apa artinya '1A' * 1?
Jonathan Rys
10 * 1 akan jadi apa?
RATAN KUMAR
Dinyatakan dalam pertanyaan bahwa tipe kolom adalah VARCHAR (10), oleh karena itu mengalikan tidak mungkin.
y434y
-2
select replace(replace(rtrim(replace(replace(replace(replace(ltrim(replace(replace([COLUMN],' ','[Ltrim]'),[Ltrim],' ')),' ',[Ltrim]),'[Ltrim]',' '),' ','[Rtrim]'),[Rtrim],' ')),' ',[Rtrim]),'[Rtrim]',' ') As Result

Ini adalah skrip Sql yang mengemulasi fungsionalitas perintah TRIM di tsql sebelum 2017, pada dasarnya sama dengan rekomendasi lainnya, tetapi yang lain mengganti dengan satu karakter tidak umum yang masih dapat terjadi, '[Rtrim]' atau '[ Ltrim] 'masih bisa muncul dalam teks, tetapi mengganti topi dengan teks unik, misalnya Panduan akan menyelesaikan masalah itu.

saya belum mengujinya tentang kecepatan

Daging babi asap
sumber
-3

Saya meminjam dari ide-ide di atas. Ini tidak cepat atau elegan. tapi itu akurat.

KASUS

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 

AKHIR

Brian Ellison
sumber
Ini juga tidak dinamis untuk memungkinkan lebih dari 3 angka nol.
JoeFletch
-3
select CASE
         WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
           THEN ''
           ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
       END
Lynn Caveny
sumber
1
Anda harus memberikan penjelasan dengan jawaban Anda, bukan hanya satu cuplikan kode. Selain itu, harap format kode sebagai kode (terdapat tombol di bagian atas kotak entri teks).
David Heyman
-4
select ltrim('000045', '0') from dual;

LTRIM
-----
45

Ini harus dilakukan.

pengguna3809240
sumber
2
Tidak ada kelebihan beban untuk sql server.
BillRob
Di PostgreSQL cukup untuk menulis select trim(leading '0' from '001A');, tetapi OP meminta SQL Server.
y434y