Dapatkan kiraan padanan tepat dalam medan teks mysql
P粉493534105
P粉493534105 2023-09-09 10:37:09
0
1
667

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粉493534105
P粉493534105

membalas semua(1)
P粉807471604

Untuk MySQL 8.X

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.

Penjelasan ungkapan biasa

(?<=^|,)4(?=$|,) sedang mencari "4" yang memenuhi kriteria berikut:

  • sebelum koma atau permulaan rentetan
  • Selepas koma atau hujung rentetan

Untuk versi MySQL yang lebih lama

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.

Mengapa ia digunakan begitu banyakREPLACE?

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 ").

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan