Di MySQL versi 8.0.19 cara membagi string menjadi kolom karena beberapa fungsi lama tidak tersedia seperti indeks karakter (), string_split () [duplikat]

Dec 29 2020

Saya memiliki satu baris yang ingin saya bagi menjadi beberapa kolom misalnya nama kolom adalah Kode dengan baris yang menunjukkan 01,04,07 untuk item produk.

Saya ingin membagi item produk menjadi kolom. Setiap saran akan membantu karena saya telah mencoba fungsi yang lebih lama tetapi menyadari versi SQL yang saya kerjakan tidak memiliki opsi seperti string_split dan indeks karakter. Saya menggunakan instr()dan substring()tetapi pembeli dapat membeli lebih banyak atau lebih sedikit item dari yang ditunjukkan di atas.

Jawaban

1 GMB Dec 29 2020 at 05:15

Masalah langsung Anda adalah desain Anda. Anda tidak boleh menyimpan beberapa nilai integer dalam kolom string. Setiap tupel nilai harus disimpan pada baris terpisah.

Adapun pertanyaan Anda: dalam versi MySQL terbaru, opsinya adalah JSON. Mungkin lebih mudah untuk meletakkan nilai dalam baris daripada di kolom. Inilah salah satu cara untuk melakukannya:

select t.*, x.*
from mytable t
cross join lateral json_table(
    concat('[', t.code, ']'),
    '$[*]' columns (rn for ordinality, code_part int path '$')
) x

Jika Anda menginginkan hasil sebagai kolom, maka salah satu opsi adalah agregasi bersyarat; Anda perlu menghitung kolom sebanyak yang diperlukan:

select t.*,
    max(case when x.rn = 1 then x.code_part end) as code_part_1,
    max(case when x.rn = 2 then x.code_part end) as code_part_2,
    ...
from mytable t
cross join lateral json_table(
    concat('[', t.code, ']'),
    '$[*]' columns (rn for ordinality, code_part int path '$')
) x
group by t.id  -- assuming that "id" is the primary key of "mytable"