Anda bisa melakukannya dengan pernyataan ini (tidak, itu tidak terlihat bagus), dengan asumsi nama tabel Anda adalah example
:
UPDATE
example e1
SET
e1.type_a = (
SELECT
CONCAT('*', GROUP_CONCAT(DISTINCT n1.value ORDER BY n1.value SEPARATOR '*'), '*') as type_a
FROM (
SELECT
id,
CASE
WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1) = '' THEN NULL
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1)
END value
FROM example e CROSS JOIN (
SELECT
a.N + b.N * 10 + 1 AS n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE
n.n <= 1 + (LENGTH(e.type_a) - LENGTH(REPLACE(e.type_a, '*', '')))
UNION
SELECT
id,
CASE
WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_b), '*', n.n), '*', -1) = '' THEN NULL
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_b), '*', n.n), '*', -1)
END value
FROM example e CROSS JOIN (
SELECT
a.N + b.N * 10 + 1 AS n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE
n.n <= 1 + (LENGTH(e.type_b) - LENGTH(REPLACE(e.type_b, '*', '')))
) n1
WHERE
n1.id = e1.id
GROUP BY
id
),
e1.type_b = ''
;
Demo dari pernyataan SELECT
Penjelasan
Pada dasarnya saya mengadaptasi metode
dari peterm
untuk menyelesaikan pemisahan. Saya harus menghapus *
. bagian luar pertama oleh TRIM.
Untuk mengizinkan string kosong sebagai nilai kolom, saya telah menambahkan konstruksi CASE, untuk menghilangkan nilai tersebut. Jika kolom Anda memiliki nilai NULL, Anda dapat mengganti CASE dengan
SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1)
dan
SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1)
UNION (tanpa kata kunci ALL) dari konstruksi ini akan memberi kita daftar nilai warna yang berbeda dan dengan GROUP BY id dan GROUP_CONCAT kita akan mendapatkan * daftar nilai yang dipisahkan. Terakhir kita tambahkan *
di awal dan di akhir agar sesuai dengan kebutuhan Anda.
Untuk pembaruan, Anda harus memodifikasi pilihan, sehingga hanya mengembalikan satu kolom dengan satu baris (dengan klausa where).
Catatan
Seperti yang dinyatakan oleh peterm ini akan memungkinkan hingga 100 nilai dalam daftar nilai Anda. Saya tidak yakin Anda akan membutuhkan lebih banyak, tetapi jika Anda mau, maka Anda harus menyesuaikan pembuatan angka dengan kebutuhan Anda.