การลบเลขศูนย์นำหน้าออกจากฟิลด์ในคำสั่ง SQL


100

ฉันกำลังทำงานกับแบบสอบถาม SQL ที่อ่านจากฐานข้อมูล SQLServer เพื่อสร้างไฟล์แตกไฟล์ ข้อกำหนดประการหนึ่งในการลบศูนย์นำหน้าออกจากฟิลด์ใดฟิลด์หนึ่งซึ่งเป็นVARCHAR(10)ฟิลด์ธรรมดา ตัวอย่างเช่นหากฟิลด์มี "00001A" คำสั่ง SELECT จำเป็นต้องส่งคืนข้อมูลเป็น "1A"

มีวิธีใน SQL ในการลบศูนย์นำหน้าด้วยวิธีนี้หรือไม่? ฉันรู้ว่ามีRTRIMฟังก์ชัน แต่ดูเหมือนว่าจะลบช่องว่างเท่านั้น


3
ในการเพิ่มคะแนนให้กับการตอบกลับstackoverflow.com/a/11129399/1635441ของ David Walker โปรดดูคำตอบของ Arvo ที่โพสต์: stackoverflow.com/a/662437/1635441
ramizmoh

คำตอบ:


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

8
สิ่งนี้จะมีปัญหาเมื่อสตริงประกอบด้วย "0" ทั้งหมดเนื่องจากจะไม่จับคู่อักขระที่ไม่ใช่ "0"
Cade Roux

จริง. มันจะส่งคืนสตริงศูนย์ที่ไม่ได้แก้ไขทั้งหมดในกรณีนี้ หากเป็นปัญหาค่าส่งคืนของ patindex จะต้องถูกทดสอบกับศูนย์
Ian Horwill

@Zapnologica: ไม่คุณต้องใส่ไว้ในคำสั่ง "update TableName set ColumnName = ... "
Ian Horwill

แน่นอนว่าถ้าคุณใช้ Update Statements
Srivastav

2
ก่อนใช้โซลูชันนี้โปรดลองดูคำตอบของ Arvo ที่โพสต์ไว้ที่นี่
OscarSosa

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

ฉันได้รับ "ฟังก์ชัน Replace ต้องการ 3 อาร์กิวเมนต์" ฉันเชื่อว่าควรอ่าน select replace (ltrim (แทนที่ (ColumnName, '0', '')), '', '0')
brentlightsey

5
สิ่งนี้จะล้มเหลวหากค่ามีช่องว่างอยู่ ตัวอย่าง: "0001 B" ควรกลายเป็น "1 B" แต่จะกลายเป็น "10B" แทน
Omaer

1
เช่นเดียวกับที่ @Omaer กล่าวถึงสิ่งนี้ไม่ปลอดภัยหากมีช่องว่างในสตริง โซลูชันที่ได้รับการปรับปรุง - ก่อนอื่นให้แทนที่ช่องว่างด้วยอักขระที่ไม่น่าจะเข้าได้และหลังจาก 0-ltrim ให้เรียกคืนอักขระเหล่านี้กลับเป็นช่องว่างหลังจากนั้น ในตอนท้ายดูค่อนข้างซับซ้อน :( ตัวอย่าง: เลือกแทนที่ (แทนที่ (ltrim (แทนที่ (แทนที่ ('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)

ผลตอบแทนN0Zนั่นคือจะกำจัดศูนย์นำหน้าและอะไรก็ตามที่อยู่ข้างหน้าพวกเขา


5
มันเป็น 0 นำหน้าได้อย่างไรถ้ามีอะไรมาก่อน
xxbbcc

4

ฉันมีความต้องการเดียวกันและใช้สิ่งนี้:

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

3

ถ้าคุณต้องการให้แบบสอบถามส่งคืน 0 แทนสตริงของศูนย์หรือค่าอื่น ๆ สำหรับเรื่องนั้นคุณสามารถเปลี่ยนเป็นคำสั่ง case ได้ดังนี้:

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


0

คุณสามารถลองนี้ - มันจะใช้เวลาดูแลเป็นพิเศษเพื่อเพียง zeroes ชั้นนำลบถ้าจำเป็น:

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

หรือโทร

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

0

นี่คือฟังก์ชันค่าสเกลาร์ SQL ที่ลบเลขศูนย์นำหน้าออกจากสตริง:

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

ในกรณีที่คุณต้องการลบเลขศูนย์นำหน้าออกจากสตริงที่ไม่ทราบขนาด

คุณอาจพิจารณาใช้คำสั่ง STUFF

นี่คือตัวอย่างของวิธีการทำงาน

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

ดูสถานการณ์ต่างๆในมือเล่นซอจะครอบคลุม

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


-1

หากต้องการลบ 0 นำหน้าจากคำสั่งเดือนถัดไปจะได้ผลแน่นอน

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

เพียงแค่แทนที่GETDATE()ด้วยฟิลด์วันที่ของตารางของคุณ


3
คำถามนี้ตอบคำถามได้อย่างไร?
deutschZuid

-2

คุณสามารถลองสิ่งนี้ SELECT REPLACE(columnname,'0','') FROM table


3
การดำเนินการนี้จะลบ 0 โดยไม่คำนึงถึงตำแหน่ง คำถามคือถามเกี่ยวกับคนชั้นนำเท่านั้น
Sunil

-2

หากต้องการลบ 0 นำหน้าคุณสามารถคูณคอลัมน์ตัวเลขด้วย 1 เช่นเลือก (ColumnName * 1)


3
'1A' * 1 เท่ากับอะไร?
Jonathan Rys

10 * 1 จะเป็นอย่างไร?
RATAN KUMAR

มีระบุไว้ในคำถามว่าประเภทคอลัมน์คือ VARCHAR (10) ดังนั้นจึงไม่สามารถคูณได้
y434y

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

นี่คือสคริปต์ Sql ที่เลียนแบบการทำงานของคำสั่ง TRIM ใน tsql ก่อนปี 2017 โดยพื้นฐานแล้วจะเหมือนกับคำแนะนำอื่น ๆ แต่คำอื่น ๆ แทนที่ด้วยอักขระที่ผิดปกติเพียงตัวเดียวซึ่งยังคงสามารถเกิดขึ้นได้ '[Rtrim]' หรือ '[ Ltrim] อาจยังคงเกิดขึ้นในข้อความ แต่การแทนที่หมวกด้วยข้อความที่ไม่ซ้ำกันเช่น Guid จะช่วยแก้ปัญหานั้นได้

ฉันยังไม่ได้ทดสอบเกี่ยวกับความเร็ว


-3

ฉันยืมมาจากแนวคิดข้างต้น นี่ไม่เร็วหรือสง่างาม แต่มันถูกต้อง

กรณี

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 

สิ้นสุด


นอกจากนี้ยังไม่ใช่แบบไดนามิกที่อนุญาตให้มีศูนย์มากกว่า 3
JoeFletch

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

1
คุณควรให้คำอธิบายพร้อมกับคำตอบของคุณไม่ใช่แค่ข้อมูลโค้ดเดียว นอกจากนี้โปรดจัดรูปแบบรหัสเป็นรหัส (มีปุ่มที่ด้านบนของช่องป้อนข้อความ)
Vivian

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

LTRIM
-----
45

สิ่งนี้ควรทำ


2
ไม่มีโอเวอร์โหลดสำหรับเซิร์ฟเวอร์ sql
BillRob

ใน PostgreSQL นั้นเพียงพอที่จะเขียนselect trim(leading '0' from '001A');ได้ แต่ OP กำลังขอ SQL Server
y434y
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.