Saya memiliki kolom yang memiliki nilai yang diformat seperti a, b, c, d. Apakah ada cara untuk menghitung jumlah koma dalam nilai itu di T-SQL?
sql-server
tsql
Orion Adrian
sumber
sumber
LTRIM
sekitar string sebagai berikut:SELECT LEN(RTRIM(@string)) - LEN(REPLACE(RTRIM(@string), ',', ''))
?Perpanjangan cepat jawaban cmsjr yang berfungsi untuk string lebih dari lebih banyak karakter.
Pemakaian:
sumber
dbo.CountOccurancesOfString( 'blah ,', ',')
akan mengembalikan 2 bukannya 1 dandbo.CountOccurancesOfString( 'hello world', ' ')
akan gagal dengan membagi dengan nol.DATALENGTH()/2
juga rumit karena ukuran char tidak jelas. Lihatlah stackoverflow.com/a/11080074/1094048 untuk cara yang sederhana dan akurat.Anda dapat membandingkan panjang string dengan satu di mana koma dihapus:
sumber
Dengan menggunakan solusi @ Andrew, Anda akan mendapatkan kinerja yang jauh lebih baik menggunakan fungsi bernilai tabel non-prosedural dan CROSS BERLAKU:
sumber
Jawaban oleh @csmjr memiliki masalah dalam beberapa kasus.
Jawabannya adalah melakukan ini:
Ini berfungsi di sebagian besar skenario, namun, coba jalankan ini:
Untuk beberapa alasan, REPLACE menghilangkan koma terakhir tetapi JUGA ruang sebelum itu (tidak yakin mengapa). Ini menghasilkan nilai 5 yang dikembalikan saat Anda mengharapkan 4. Berikut adalah cara lain untuk melakukan ini yang akan berfungsi bahkan dalam skenario khusus ini:
Perhatikan bahwa Anda tidak perlu menggunakan tanda bintang. Penggantian dua karakter apa pun akan dilakukan. Idenya adalah Anda memperpanjang string dengan satu karakter untuk setiap instance karakter yang Anda hitung, lalu kurangi panjang aslinya. Ini pada dasarnya metode yang berlawanan dari jawaban asli yang tidak datang dengan efek samping pemangkasan yang aneh.
sumber
sumber
Jawaban yang diterima benar, memperluasnya menggunakan 2 atau lebih karakter dalam substring:
sumber
Jika kita tahu ada batasan pada LEN dan ruang, mengapa kita tidak mengganti ruang terlebih dahulu? Maka kita tahu tidak ada ruang untuk membingungkan LEN.
sumber
sumber
Saya kira Darrel Lee punya jawaban yang cukup bagus. Ganti
CHARINDEX()
denganPATINDEX()
, dan Anda dapat melakukanregex
pencarian yang lemah di sepanjang string, juga ...Seperti, katakan Anda menggunakan ini untuk
@pattern
:Mengapa Anda mungkin ingin melakukan sesuatu yang gila seperti ini?
Katakanlah Anda sedang memuat string teks terbatas ke tabel pementasan, di mana bidang yang menyimpan data adalah sesuatu seperti varchar (8000) atau nvarchar (maks) ...
Terkadang lebih mudah / lebih cepat untuk melakukan ELT (Extract-Load-Transform) dengan data daripada ETL (Extract-Transform-Load), dan salah satu cara untuk melakukan ini adalah dengan memuat catatan yang dibatasi seperti apa adanya ke dalam tabel pementasan, terutama jika Anda mungkin menginginkan cara yang lebih sederhana untuk melihat catatan yang luar biasa daripada berurusan dengan mereka sebagai bagian dari paket SSIS ... tapi itu perang suci untuk utas yang berbeda.
sumber
Hal-hal berikut harus melakukan trik untuk pencarian karakter tunggal dan banyak karakter:
Fungsi ini dapat disederhanakan sedikit menggunakan tabel angka (dbo.Nums):
sumber
Gunakan kode ini, ini berfungsi dengan baik. Saya telah membuat fungsi sql yang menerima dua parameter, param pertama adalah string panjang yang ingin kita cari di dalamnya, dan dapat menerima panjang string hingga 1500 karakter (tentu saja Anda dapat memperluas atau bahkan mengubahnya ke datatype teks ). Dan parameter kedua adalah substring yang ingin kita hitung jumlah kemunculannya (panjangnya hingga 200 karakter, tentu saja Anda dapat mengubahnya sesuai dengan kebutuhan Anda). dan output adalah bilangan bulat, mewakili jumlah frekuensi ..... nikmatilah.
sumber
Saya akhirnya menulis fungsi ini yang harus mencakup semua situasi yang mungkin, menambahkan awalan char dan akhiran ke input. arang ini dievaluasi berbeda dengan arang yang terdapat pada parameter pencarian, sehingga tidak dapat mempengaruhi hasilnya.
pemakaian
sumber
sumber
Di SQL 2017 atau lebih tinggi, Anda dapat menggunakan ini:
sumber
kode T-SQL ini menemukan dan mencetak semua kemunculan pola @p dalam kalimat @s. Anda dapat melakukan pemrosesan pada kalimat setelahnya.
hasilnya adalah: 1 6 13 20
sumber
untuk SQL Server 2017
sumber
Anda dapat menggunakan prosedur tersimpan berikut untuk mengambil, nilai.
sumber
@c1
ke jawaban yang dia butuhkan. Apa gunanya sisa kode, mengingat perlu tabel yang sudah ada sebelumnya dipanggiltable1
untuk bekerja, memiliki delimeter kode keras, dan tidak dapat digunakan sebaris seperti jawaban yang diterima dari dua bulan sebelumnya?Tes Replace / Len lucu, tetapi mungkin sangat tidak efisien (terutama dalam hal memori). Fungsi sederhana dengan loop akan melakukan pekerjaan itu.
sumber
Mungkin Anda sebaiknya tidak menyimpan data seperti itu. Merupakan praktik yang buruk untuk pernah menyimpan daftar yang dibatasi koma di bidang. TI sangat tidak efisien untuk query. Ini harus berupa tabel terkait.
sumber