Jawaban lain di sini untuk tidak mempertimbangkan jika Anda memiliki semua-nol (atau bahkan nol).
Beberapa selalu default string kosong ke nol, yang salah ketika seharusnya tetap kosong.
Baca kembali pertanyaan aslinya. Ini menjawab apa yang diinginkan Penanya.
Solusi # 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"
Solusi # 2 (dengan data sampel):
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
Hasil:
Ringkasan:
Anda dapat menggunakan apa yang saya miliki di atas untuk menghapus satu-nol dari memimpin-nol.
Jika Anda berencana untuk sering menggunakannya kembali, maka letakkan di Inline-Table-Valued-Function (ITVF).
Kekhawatiran Anda tentang masalah kinerja dengan UDF dapat dimengerti.
Namun, masalah ini hanya berlaku untuk Semua-Skalar-Fungsi dan Multi-Statement-Table-Functions.
Menggunakan ITVF tidak apa-apa.
Saya memiliki masalah yang sama dengan database Pihak ke-3 kami.
Dengan bidang Alpha-Numerik banyak yang masuk tanpa ruang terkemuka, sial manusia!
Ini membuat sambungan tidak mungkin tanpa membersihkan nol-awal yang hilang.
Kesimpulan:
Alih-alih menghapus leading-nol, Anda mungkin ingin mempertimbangkan hanya melapisi nilai-nilai Anda yang dipangkas dengan leading-nol saat Anda bergabung.
Lebih baik lagi, bersihkan data Anda di tabel dengan menambahkan angka nol di depan, lalu bangun kembali indeks Anda.
Saya pikir ini akan menjadi WAY lebih cepat dan tidak terlalu rumit.
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF(' 0A10 ', ''))), 10)--0000000A10
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF('', ''))), 10)--NULL --When Blank.