cari

Rumah  >  Soal Jawab  >  teks badan

Dapatkan kiraan padanan tepat dalam medan teks mysql

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粉493534105P粉493534105472 hari yang lalu696

membalas semua(1)saya akan balas

  • P粉807471604

    P粉8074716042023-09-10 00:31:48

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

    balas
    0
  • Batalbalas