Burada sıfırlar (hatta tek bir sıfır) varsa diğer cevaplar dikkate alınmaz.
Bazıları her zaman boş bir dizeyi sıfıra ayarlar, bu da boş kalması gerektiğinde yanlıştır.
Orijinal soruyu tekrar okuyun. Bu, Soru Sahibinin istediklerini cevaplar.
Çözüm # 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"
Çözüm # 2 (örnek verilerle):
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
Sonuçlar:
Özet:
Baştaki sıfırları kaldırmak için yukarıda sahip olduğum şeyleri kullanabilirsiniz.
Yeniden kullanmayı planlıyorsanız, bir Satır İçi-Tablo-Değerli İşlev (ITVF) içine yerleştirin.
UDF'lerle ilgili performans sorunlarına ilişkin endişeleriniz anlaşılabilir.
Ancak, bu sorun yalnızca All-Scalar-İşlevleri ve Çoklu Tablo-Tablo-İşlevleri için geçerlidir.
ITVF'leri kullanmak gayet iyi.
Üçüncü taraf veritabanımızda da aynı sorun var.
Alfa-Sayısal alanları ile birçok kişi önde gelen boşluklar olmadan girilir, insanlar!
Bu, eksik baştaki sıfırları temizlemeden birleştirmeleri imkansız hale getirir.
Sonuç:
Baştaki sıfırları kaldırmak yerine, birleşimlerinizi yaparken yalnızca kesilmiş değerlerinizi baştaki sıfırlarla doldurmayı düşünebilirsiniz.
Daha da iyisi, baştaki sıfırları ekleyerek ve ardından dizinlerinizi yeniden oluşturarak tablodaki verilerinizi temizleyin.
Bunun daha hızlı ve daha az karmaşık olacağını düşünüyorum.
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF(' 0A10 ', ''))), 10)--0000000A10
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF('', ''))), 10)--NULL --When Blank.