ใน MySQL เวอร์ชัน 8.0.19 วิธีการแยกสตริงออกเป็นคอลัมน์เนื่องจากฟังก์ชันเก่าบางฟังก์ชันไม่มีให้ใช้งานเช่น character index (), string_split () [duplicate]
ฉันมีหนึ่งแถวที่ฉันต้องการแยกออกเป็นคอลัมน์เช่นชื่อคอลัมน์คือรหัสโดยแถวที่แสดง 01,04,07 สำหรับรายการผลิตภัณฑ์
ฉันต้องการแยกรายการผลิตภัณฑ์ออกเป็นคอลัมน์ ข้อเสนอแนะใด ๆ จะเป็นประโยชน์เนื่องจากฉันได้ลองใช้ฟังก์ชันรุ่นเก่า แต่ตระหนักว่าเวอร์ชัน SQL ที่ฉันกำลังดำเนินการไม่มีตัวเลือกเหล่านั้นเช่น string_split และดัชนีอักขระ ฉันเคยใช้instr()
และsubstring()
แต่ผู้ซื้ออาจซื้อสินค้ามากกว่าหรือน้อยกว่าที่แสดงไว้ด้านบน
คำตอบ
ปัญหาเฉพาะหน้าของคุณคือการออกแบบของคุณ คุณไม่ควรเก็บค่าจำนวนเต็มหลายค่าในคอลัมน์สตริง ค่าทูเพิลแต่ละค่าควรเก็บไว้ในแถวแยกกัน
สำหรับคำถามของคุณ: ใน MySQL เวอร์ชันล่าสุดตัวเลือกคือ JSON การใส่ค่าในแถวแทนที่จะเป็นคอลัมน์อาจจะสะดวกกว่า นี่เป็นวิธีหนึ่งที่ทำได้:
select t.*, x.*
from mytable t
cross join lateral json_table(
concat('[', t.code, ']'),
'$[*]' columns (rn for ordinality, code_part int path '$')
) x
หากคุณต้องการให้ผลลัพธ์เป็นคอลัมน์ตัวเลือกหนึ่งคือการรวมแบบมีเงื่อนไข คุณต้องระบุคอลัมน์ให้มากที่สุดเท่าที่จำเป็น:
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"