คำตอบอื่น ๆ ที่นี่เพื่อไม่พิจารณาหากคุณมีทั้งหมดเป็นศูนย์ (หรือแม้แต่ศูนย์เดียว)
บางคนมักจะเริ่มต้นสตริงที่ว่างเปล่าให้เป็นศูนย์ซึ่งผิดเมื่อมันควรจะยังคงว่างเปล่า
อ่านคำถามเดิมอีกครั้ง นี่เป็นคำตอบที่ผู้ถามต้องการ
โซลูชัน # 1:
--This example uses both Leading and Trailing zero's.
--Avoid losing those Trailing zero's and converting embedded spaces into more zeros.
--I added a non-whitespace character ("_") to retain trailing zero's after calling Replace().
--Simply remove the RTrim() function call if you want to preserve trailing spaces.
--If you treat zero's and empty-strings as the same thing for your application,
-- then you may skip the Case-Statement entirely and just use CN.CleanNumber .
DECLARE @WackadooNumber VarChar(50) = ' 0 0123ABC D0 '--'000'--
SELECT WN.WackadooNumber, CN.CleanNumber,
(CASE WHEN WN.WackadooNumber LIKE '%0%' AND CN.CleanNumber = '' THEN '0' ELSE CN.CleanNumber END)[AllowZero]
FROM (SELECT @WackadooNumber[WackadooNumber]) AS WN
OUTER APPLY (SELECT RTRIM(RIGHT(WN.WackadooNumber, LEN(LTRIM(REPLACE(WN.WackadooNumber + '_', '0', ' '))) - 1))[CleanNumber]) AS CN
--Result: "123ABC D0"
โซลูชัน # 2 (พร้อมข้อมูลตัวอย่าง):
SELECT O.Type, O.Value, Parsed.Value[WrongValue],
(CASE WHEN CHARINDEX('0', T.Value) > 0--If there's at least one zero.
AND LEN(Parsed.Value) = 0--And the trimmed length is zero.
THEN '0' ELSE Parsed.Value END)[FinalValue],
(CASE WHEN CHARINDEX('0', T.Value) > 0--If there's at least one zero.
AND LEN(Parsed.TrimmedValue) = 0--And the trimmed length is zero.
THEN '0' ELSE LTRIM(RTRIM(Parsed.TrimmedValue)) END)[FinalTrimmedValue]
FROM
(
VALUES ('Null', NULL), ('EmptyString', ''),
('Zero', '0'), ('Zero', '0000'), ('Zero', '000.000'),
('Spaces', ' 0 A B C '), ('Number', '000123'),
('AlphaNum', '000ABC123'), ('NoZero', 'NoZerosHere')
) AS O(Type, Value)--O is for Original.
CROSS APPLY
( --This Step is Optional. Use if you also want to remove leading spaces.
SELECT LTRIM(RTRIM(O.Value))[Value]
) AS T--T is for Trimmed.
CROSS APPLY
( --From @CadeRoux's Post.
SELECT SUBSTRING(O.Value, PATINDEX('%[^0]%', O.Value + '.'), LEN(O.Value))[Value],
SUBSTRING(T.Value, PATINDEX('%[^0]%', T.Value + '.'), LEN(T.Value))[TrimmedValue]
) AS Parsed
ผล:
สรุป:
คุณสามารถใช้สิ่งที่ฉันมีด้านบนสำหรับการลบหนึ่งในศูนย์ชั้นนำ
หากคุณวางแผนที่จะนำมาใช้ซ้ำจำนวนมากให้วางไว้ใน Inline-Table-Valued-Function (ITVF)
ความกังวลของคุณเกี่ยวกับปัญหาประสิทธิภาพการทำงานกับ UDF นั้นเป็นที่เข้าใจได้
อย่างไรก็ตามปัญหานี้ใช้กับฟังก์ชั่นสเกลาร์ทั้งหมดและมัลติฟังก์ชั่นแบบตาราง
การใช้ ITVF นั้นดีมาก
ฉันมีปัญหาเดียวกันกับฐานข้อมูลบุคคลที่สามของเรา
ด้วยฟิลด์ที่เป็นตัวเลข - อัลฟ่าจำนวนมากถูกป้อนโดยไม่มีช่องว่างนำมนุษย์อันตราย!
สิ่งนี้ทำให้การเชื่อมต่อเป็นไปไม่ได้โดยไม่ต้องล้างเลขศูนย์นำหน้าที่ขาดหายไป
สรุป:
แทนการลบเลขนำหน้าคุณอาจต้องพิจารณาเพิ่มความสมบูรณ์ของค่าที่ตัดแต่งด้วยนำเลขศูนย์เมื่อคุณเข้าร่วม
ยังดีกว่าล้างข้อมูลของคุณในตารางโดยเพิ่มศูนย์นำหน้าแล้วสร้างดัชนีของคุณใหม่
ฉันคิดว่านี่จะเป็นวิธีที่เร็วและซับซ้อนน้อยกว่า
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF(' 0A10 ', ''))), 10)--0000000A10
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF('', ''))), 10)--NULL --When Blank.