Bagaimana Anda bisa menghapus semua karakter yang bukan abjad dari string?
Bagaimana dengan non-alfanumerik?
Apakah ini harus menjadi fungsi khusus atau apakah ada solusi yang lebih umum?
sql-server
parsing
user-defined-functions
alphanumeric
alphabetic
Bahkan Mien
sumber
sumber
Versi parameter dari G Mastros ' jawaban mengagumkan :
Hanya alfabet:
Hanya numerik:
Hanya alfanumerik:
Non-alfanumerik:
sumber
SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9\s')
yang masih strip spasi. Saya juga mencoba menggunakan[[:blank:]]
tetapi itu merusak fungsi dan tidak ada yang dihapus dari string. Ive terdekat yang saya dapatkan adalah dengan menggunakan:SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9 ')
(hard-coding ruang dalam pola regex). Namun itu tidak menghapus jeda baris.SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^ a-z0-9')
Percaya atau tidak, dalam sistem saya, fungsi jelek ini berkinerja lebih baik daripada G Mastros yang elegan.
sumber
ASCII
integer di sini dan membandingkan langsung outputSUBSTRING
dengan beberapa karakter, misalnya:SET @ch=SUBSTRING(@s, @p, 1)
danIF @ch BETWEEN '0' AND '9' OR @ch BETWEEN 'a' AND 'z' OR @ch BETWEEN 'A' AND 'Z' ...
Saya tahu bahwa SQL buruk dalam manipulasi string, tetapi saya tidak berpikir akan sesulit ini. Berikut adalah fungsi sederhana untuk menghapus semua angka dari string. Akan ada cara yang lebih baik untuk melakukan ini, tetapi ini adalah awal.
Keluaran
Babak 2 - Daftar Hitam Berbasis Data
Keluaran
Tantangan saya kepada pembaca: Dapatkah Anda menjadikan ini lebih efisien? Bagaimana dengan menggunakan rekursi?
sumber
Jika Anda seperti saya dan tidak memiliki akses untuk hanya menambahkan fungsi ke data produksi Anda tetapi masih ingin melakukan pemfilteran seperti ini, inilah solusi SQL murni menggunakan tabel PIVOT untuk menyatukan kembali potongan yang difilter.
NB Saya hardcoded tabel hingga 40 karakter, Anda harus menambahkan lebih banyak jika Anda memiliki string lebih lama untuk difilter.
sumber
Setelah melihat semua solusi yang diberikan, saya pikir harus ada metode SQL murni yang tidak memerlukan fungsi atau permintaan CTE / XML, dan tidak melibatkan sulit untuk mempertahankan pernyataan REPLACE bersarang. Ini solusinya:
Keuntungan melakukannya dengan cara ini adalah bahwa karakter yang valid terkandung dalam satu string dalam sub kueri sehingga mudah untuk mengkonfigurasi ulang untuk serangkaian karakter yang berbeda.
Kelemahannya adalah Anda harus menambahkan sederetan SQL untuk setiap karakter hingga ukuran kolom Anda. Untuk mempermudah tugas itu, saya hanya menggunakan skrip Powershell di bawah ini, contoh ini untuk VARCHAR (64):
sumber
Berikut ini cara lain untuk menghapus karakter non-alfabet menggunakan a
iTVF
. Pertama, Anda memerlukan pemisah tali berbasis pola. Ini salah satu artikel Dwain Camp :Sekarang Anda memiliki splitter berbasis pola, Anda perlu membagi string yang cocok dengan pola:
dan kemudian menyatukannya kembali untuk mendapatkan hasil yang diinginkan:
SAMPEL
Hasil:
sumber
Solusi ini, terinspirasi oleh solusi Pak Allen, membutuhkan
Numbers
tabel bilangan bulat (yang harus Anda miliki jika Anda ingin melakukan operasi permintaan yang serius dengan kinerja yang baik). Itu tidak memerlukan CTE. Anda dapat mengubahNOT IN (...)
ekspresi untuk mengecualikan karakter tertentu, atau mengubahnya menjadi ekspresiIN (...)
ATAULIKE
untuk mempertahankan hanya karakter tertentu.sumber
Inilah solusi yang tidak perlu membuat fungsi atau mendaftar semua instance karakter untuk diganti. Ini menggunakan pernyataan DENGAN rekursif dalam kombinasi dengan PATINDEX untuk menemukan karakter yang tidak diinginkan. Ini akan mengganti semua karakter yang tidak diinginkan dalam kolom - hingga 100 karakter buruk unik yang terkandung dalam string apa pun. (EG "ABC123DEF234" akan berisi 4 karakter buruk 1, 2, 3 dan 4) Batas 100 adalah jumlah maksimum rekursi yang diperbolehkan dalam pernyataan WITH, tetapi ini tidak menentukan batas jumlah baris yang diproses, yang hanya dibatasi oleh memori yang tersedia.
Jika Anda tidak ingin hasil yang berbeda, Anda dapat menghapus dua opsi dari kode.
sumber
Saya menempatkan ini di kedua tempat di mana PatIndex disebut.
untuk fungsi kustom di atas RemoveNonAlphaCharacters dan menamainya RemoveNonAlphaNumericCharacters
sumber
--Pertama membuat satu fungsi
Sekarang panggil fungsi ini seperti
Hasilnya seperti
sumber
Dari perspektif kinerja, saya akan menggunakan Fungsi Inline:
sumber
Berikut ini adalah solusi CTE rekursif lain, berdasarkan jawaban @ Grehard Weiss di sini . Anda harus dapat menyalin dan menempelkan seluruh blok kode ke SSMS dan bermain dengannya di sana. Hasilnya mencakup beberapa kolom tambahan untuk membantu kami memahami apa yang terjadi. Butuh beberapa saat sampai saya mengerti semua yang terjadi dengan PATINDEX (RegEx) dan CTE rekursif.
sumber
Menggunakan tabel angka yang dihasilkan CTE untuk memeriksa setiap karakter, lalu UNTUK XML untuk menyatukan ke string nilai yang disimpan ...
sumber
sumber
cara ini tidak bekerja untuk saya karena saya mencoba untuk menjaga huruf Arab saya mencoba mengganti ekspresi reguler tetapi juga tidak berhasil. saya menulis metode lain untuk bekerja pada tingkat ASCII karena itu satu-satunya pilihan saya dan berhasil.
PERGILAH
sumber
Meskipun posting agak lama, saya ingin mengatakan yang berikut ini. Masalah yang saya miliki dengan solusi di atas adalah tidak menyaring karakter seperti ç, ë, ï, dll. Saya mengadaptasi fungsi sebagai berikut (Saya hanya menggunakan string 80 varchar untuk menghemat memori):
sumber
Saya baru saja menemukan ini dibangun ke Oracle 10g jika itu yang Anda gunakan. Saya harus menghapus semua karakter khusus untuk membandingkan nomor telepon.
sumber