Saya telah menggunakan ini selama beberapa waktu:
SUBSTRING(str_col, PATINDEX('%[^0]%', str_col), LEN(str_col))
Namun baru-baru ini, saya menemukan masalah dengan kolom dengan semua karakter "0" seperti '00000000' karena tidak pernah menemukan karakter non- "0" yang cocok.
Teknik alternatif yang pernah saya lihat adalah menggunakan TRIM
:
REPLACE(LTRIM(REPLACE(str_col, '0', ' ')), ' ', '0')
Ini memiliki masalah jika ada spasi yang disematkan, karena mereka akan diubah menjadi "0" ketika spasi diubah kembali menjadi "0".
Saya mencoba menghindari skalar UDF. Saya telah menemukan banyak masalah kinerja dengan UDF di SQL Server 2005.
sql
sql-server
sql-server-2005
tsql
string
Cade Roux
sumber
sumber
Jawaban:
sumber
Arvo
di SO!Mengapa Anda tidak memberikan nilai saja
INTEGER
lalu kembali keVARCHAR
?sumber
SELECT CASE ISNUMERIC(str_col) WHEN 1 THEN CAST(CAST(str_col AS BIGINT) AS VARCHAR(255)) ELSE str_col END
BIGINT
, beberapa jenis string masih akan gagal konversi ini. Pertimbangkan0001E123
misalnya.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:
Solusi # 2 (dengan data sampel):
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.
sumber
Alih-alih spasi ganti 0 dengan karakter spasi putih 'langka' yang biasanya tidak ada dalam teks kolom. Umpan baris mungkin cukup baik untuk kolom seperti ini. Maka Anda dapat LTrim secara normal dan mengganti karakter khusus dengan 0 lagi.
sumber
Berikut ini akan mengembalikan '0' jika string seluruhnya terdiri dari nol:
sumber
Ini membuat Fungsi yang bagus ....
sumber
cast (value as int) akan selalu berfungsi jika string adalah angka
sumber
Versi saya tentang ini adalah adaptasi dari karya Arvo, dengan sedikit lebih banyak ditambahkan untuk memastikan dua kasus lainnya.
1) Jika kita memiliki semua 0s, kita harus mengembalikan digit 0.
2) Jika kita memiliki karakter kosong, kita masih harus mengembalikan karakter kosong.
sumber
Saran dari Thomas G bekerja untuk kebutuhan kita.
Bidang dalam kasus kami sudah string dan hanya nol terkemuka yang perlu dipangkas. Sebagian besar semuanya numerik tetapi kadang-kadang ada huruf sehingga konversi INT sebelumnya akan macet.
sumber
Ini memiliki batas panjang string yang dapat dikonversi menjadi INT
sumber
Jika Anda menggunakan Snowflake SQL, gunakan ini:
Fungsi ltrim menghapus semua instance dari set karakter yang ditunjuk dari sisi kiri.
Jadi ltrim (str_col, '0') pada '00000008A' akan mengembalikan '8A'
Dan rtrim (str_col, '0.') Pada '$ 125.00' akan mengembalikan '$ 125'
sumber
Bekerja dengan baik bahkan dengan '0', '00' dan seterusnya.
sumber
Coba ini:
sumber
Jika Anda tidak ingin mengubahnya menjadi int, saya lebih suka logika di bawah ini karena dapat menangani nulls IFNULL (bidang, LTRIM (bidang, '0'))
sumber
Di MySQL Anda dapat melakukan ini ...
sumber