Xóa các số 0 đứng đầu khỏi một trường trong câu lệnh SQL


98

Tôi đang làm việc trên một truy vấn SQL đọc từ cơ sở dữ liệu SQLServer để tạo tệp trích xuất. Một trong những yêu cầu để xóa các số 0 đứng đầu khỏi một trường cụ thể, đó là một VARCHAR(10)trường đơn giản . Vì vậy, ví dụ: nếu trường chứa '00001A', câu lệnh SELECT cần trả về dữ liệu là '1A'.

Có cách nào trong SQL để dễ dàng loại bỏ các số 0 ở đầu theo cách này không? Tôi biết có một RTRIMchức năng, nhưng điều này dường như chỉ để loại bỏ dấu cách.


3
Là một phiếu bầu tán thành David Walker của stackoverflow.com/a/11129399/1635441 Đáp lại, vui lòng tham khảo câu trả lời Arvo của posted: stackoverflow.com/a/662437/1635441
ramizmoh

Câu trả lời:


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

8
Điều này sẽ có vấn đề khi chuỗi hoàn toàn được tạo thành từ "0", vì nó sẽ không bao giờ khớp với một ký tự không phải "0".
Cade Roux

Thật. Nó sẽ trả về tất cả chuỗi số không chưa sửa đổi trong trường hợp này. Nếu đây là vấn đề, giá trị trả về của patindex sẽ phải được kiểm tra bằng 0.
Ian Horwill

@Zapnologica: Không. Bạn phải đặt nó trong câu lệnh "cập nhật TableName set ColumnName = ...".
Ian Horwill

Chắc chắn rồi, nếu bạn sử dụng Cập nhật Báo cáo.
Srivastav

1
Trước khi sử dụng giải pháp này, hãy cố gắng nhìn vào câu trả lời của Arvo được đăng ở đây
OscarSosa

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

Tôi nhận được "Hàm thay thế yêu cầu 3 đối số." Tôi tin rằng nó nên đọc lựa chọn thay thế (ltrim (thay thế (ColumnName, '0', '')), '', '0')
brentlightsey

5
Điều này sẽ không thành công nếu giá trị có một khoảng trống trong đó. Ví dụ: "0001 B" nên trở thành "1 B" nhưng sẽ trở thành "10B" thay thế.
Omaer

1
Giống như @Omaer đã đề cập, điều này không an toàn nếu có một số khoảng trắng trong chuỗi. Giải pháp cải tiến - trước tiên hãy thay thế các dấu cách bằng ký tự không có khả năng nhận được đầu vào và sau 0-ltrim, hãy khôi phục các ký tự này về dấu cách sau đó. Cuối cùng thì trông khá phức tạp :( Ví dụ: select Replace (Replace (ltrim (Replace (Replace ('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)

lợi nhuận N0Z, có nghĩa là, sẽ thoát khỏi zero hàng đầu và bất cứ điều gì mà đến trước mặt họ.


5
Làm thế nào nó là một số 0 đứng đầu nếu một cái gì đó đến trước nó?
xxbbcc

4

Tôi có cùng nhu cầu và sử dụng cái này:

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

3

Nếu bạn muốn truy vấn trả về một số 0 thay vì một chuỗi các số 0 hoặc bất kỳ giá trị nào khác cho vấn đề đó, bạn có thể biến điều này thành một câu lệnh trường hợp như sau:

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

2

Bạn có thể sử dụng cái này:

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

0

Bạn có thể thử cách này - cần đặc biệt lưu ý chỉ loại bỏ các số 0 ở đầu nếu cần:

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

Hoặc bạn có thể đơn giản gọi

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

0

Đây là hàm giá trị vô hướng của SQL loại bỏ các số không ở đầu chuỗi:

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

0

Trong trường hợp bạn muốn xóa các số 0 ở đầu chuỗi có kích thước không xác định.

Bạn có thể cân nhắc sử dụng lệnh STUFF.

Đây là một ví dụ về cách nó sẽ hoạt động.

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

Xem trong fiddler các kịch bản khác nhau mà nó sẽ bao gồm

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


-1

Để xóa số 0 đứng đầu từ câu lệnh sau chắc chắn sẽ hoạt động.

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

Chỉ cần Thay thế GETDATE()bằng trường ngày của Bảng của bạn.


3
Làm thế nào chính xác để trả lời câu hỏi này?
deutschZuid

-2

bạn có thể thử cái này SELECT REPLACE(columnname,'0','') FROM table


3
Thao tác này sẽ xóa 0 bất kể vị trí của nó. Câu hỏi chỉ hỏi về những người dẫn đầu.
Sunil

-2

Để loại bỏ số 0 đứng đầu, bạn có thể nhân cột số với 1 Ví dụ: Chọn (Tên cột * 1)


3
'1A' * 1 bằng gì?
Jonathan Rys

10 * 1 sẽ là gì?
RATAN KUMAR

Đã nêu trong câu hỏi rằng loại cột là VARCHAR (10), do đó không thể nhân được.
y434y

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

Đây là một tập lệnh Sql mô phỏng chức năng của lệnh TRIM trong tsql trước năm 2017, về cơ bản nó giống với các gợi ý khác, nhưng các tập lệnh khác thay thế bằng một ký tự không phổ biến duy nhất vẫn có thể xảy ra, '[Rtrim]' hoặc '[ Ltrim] 'vẫn có thể xảy ra trong văn bản, nhưng việc thay thế hat bằng một văn bản duy nhất, chẳng hạn như Hướng dẫn sẽ giải quyết vấn đề đó.

tôi đã không kiểm tra nó về tốc độ


-3

Tôi vay mượn từ những ý tưởng trên. Điều này không phải là nhanh chóng cũng không phải là thanh lịch. nhưng nó là chính xác.

TRƯỜNG HỢP

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 

KẾT THÚC


Nó cũng không động để cho phép nhiều hơn 3 số 0.
JoeFletch

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

1
Bạn nên giải thích câu trả lời của mình, không chỉ một đoạn mã. Ngoài ra, hãy định dạng mã dưới dạng mã (có một nút dọc theo đầu hộp nhập văn bản).
David Heyman,

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

LTRIM
-----
45

Điều này nên làm.


2
Không có quá tải cho máy chủ sql.
BillRob

Trong PostgreSQL, bạn nên viết select trim(leading '0' from '001A');, nhưng OP đang yêu cầu SQL Server.
y434y
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.