Rumah > Soal Jawab > teks badan
Saya mempunyai jadual MySql dengan medan teks.
Medan teks akan diisi dengan urutan rawak yang serupa dengan yang berikut (boleh jadi sebarang nilai integer):
14,4,24,20,34,2
34,67,4,98,64
Tiada koma di hadapan atau di belakang dalam rentetan (nilai medan teks).
Sebagai contoh, saya ingin mengira jumlah kejadian hanya '4'.
Pertanyaan pada dua baris ini harus mengembalikan 2 dan bukannya 7.
Tidak pasti cara menulis pertanyaan seperti ini.
Terima kasih
P粉8074716042023-09-10 00:31:48
Anda boleh menggunakan REGEXP_REPLACE
untuk mencari 4, keluarkannya daripada rentetan dan hitung perbezaan panjang:
SELECT LENGTH(vals) - LENGTH(REGEXP_REPLACE(vals, '(?<=^|,)4(?=$|,)', '')) FROM T;
Ini akan mengembalikan bilangan "4" dalam setiap baris, dan kemudian anda boleh menambah kesemuanya:
SELECT SUM(LENGTH(vals) - LENGTH(REGEXP_REPLACE(vals, '(?<=^|,)4(?=$|,)', ''))) FROM T;
Anda juga mungkin mahu menggunakan AS
untuk menamakan semula nilai ini.
(?<=^|,)4(?=$|,)
sedang mencari "4" yang memenuhi kriteria berikut:
Pertanyaan itu sangat hodoh, tetapi anda boleh menggunakan ini:
SELECT vals, LENGTH(Replace(Replace(Concat(',', vals, ','), ',4,', ',_,'), ',4,', ',_,')) - LENGTH(Replace(Replace(Replace(Concat(',', vals, ','), ',4,', ',_,'), ',4,', ',_,'), "_", "")) AS NB4 FROM test_table;
Ia bermula dengan menggantikan semua kejadian "4" dengan garis bawah (_
) (cth. tidak menggantikan 4 dalam 54).
Ia kemudian mengira panjang rentetan dengan garis bawah tersebut tolak panjang rentetan tanpa garis bawah, iaitu bilangan "4" dalam senarai anda.
REPLACE
? Semasa menguji pertanyaan, saya mendapati bahawa fungsi MySQL REPLACE
函数的行为与我们期望的不同。以这个例子为例:4,4,4,4,4
,如果使用单个Replace,我们期望它返回_,_,_,_,_
。然而,它会原地替换逗号,如果逗号“匹配”两次,它不会计算第二次,这就是为什么需要2个REPLACE(..., ",4,", ",_,")
berkelakuan berbeza daripada yang kami jangkakan. Mengambil contoh ini: 4,4,4,4,4
, jika satu Ganti digunakan, kami mengharapkan ia mengembalikan _,_,_,_,_
. Walau bagaimanapun, ia menggantikan koma di tempatnya, dan jika koma "padanan" dua kali, ia tidak dikira untuk kali kedua, itulah sebabnya 2 REPLACE(..., ",4,", ",_, diperlukan ")
.