आप इसे इस कथन के साथ कर सकते हैं (नहीं, यह अच्छा नहीं लग रहा है), यह मानते हुए कि आपकी तालिका का नाम 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 = ''
;
डेमो सेलेक्ट स्टेटमेंट का
स्पष्टीकरण
मूल रूप से मैंने विधि
को अपनाया। का peterm
बंटवारा करने के लिए। मुझे बाहरी *
remove को हटाना पड़ा पहले TRIM द्वारा।
खाली स्ट्रिंग को कॉलम मान के रूप में अनुमति देने के लिए, मैंने ऐसे मानों को खत्म करने के लिए CASE निर्माण जोड़ा है। यदि आपके कॉलम में इसके बजाय NULL मान हैं, तो आप CASE को
. द्वारा प्रतिस्थापित कर सकते हैंSUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1)
और
SUBSTRING_INDEX(SUBSTRING_INDEX(TRIM(BOTH '*' FROM e.type_a), '*', n.n), '*', -1)
इस निर्माण का UNION (बिना ALL कीवर्ड) हमें अलग-अलग रंग मानों की सूची देगा और GROUP BY id और GROUP_CONCAT के साथ हमें * अलग मूल्य सूची मिलेगी। अंत में हम एक अग्रणी और अनुगामी *
. जोड़ते हैं अपनी आवश्यकताओं से मेल खाने के लिए।
अपडेट के लिए आपको चयन को संशोधित करना होगा, ताकि यह एक पंक्ति के साथ सिर्फ एक कॉलम लौटाए (कहां क्लॉज के साथ)।
नोट
जैसा कि पीटरम ने कहा है, यह आपकी मूल्य सूची में 100 मानों तक की अनुमति देगा। मुझे विश्वास नहीं है कि आपको और अधिक की आवश्यकता होगी, लेकिन यदि आप करेंगे, तो आपको अपनी आवश्यकताओं के अनुसार संख्याओं के सृजन को अनुकूलित करना होगा।