ใน MySQL เวอร์ชัน 8.0.19 วิธีการแยกสตริงออกเป็นคอลัมน์เนื่องจากฟังก์ชันเก่าบางฟังก์ชันไม่มีให้ใช้งานเช่น character index (), string_split () [duplicate]

Dec 29 2020

ฉันมีหนึ่งแถวที่ฉันต้องการแยกออกเป็นคอลัมน์เช่นชื่อคอลัมน์คือรหัสโดยแถวที่แสดง 01,04,07 สำหรับรายการผลิตภัณฑ์

ฉันต้องการแยกรายการผลิตภัณฑ์ออกเป็นคอลัมน์ ข้อเสนอแนะใด ๆ จะเป็นประโยชน์เนื่องจากฉันได้ลองใช้ฟังก์ชันรุ่นเก่า แต่ตระหนักว่าเวอร์ชัน SQL ที่ฉันกำลังดำเนินการไม่มีตัวเลือกเหล่านั้นเช่น string_split และดัชนีอักขระ ฉันเคยใช้instr()และsubstring()แต่ผู้ซื้ออาจซื้อสินค้ามากกว่าหรือน้อยกว่าที่แสดงไว้ด้านบน

คำตอบ

1 GMB Dec 29 2020 at 05:15

ปัญหาเฉพาะหน้าของคุณคือการออกแบบของคุณ คุณไม่ควรเก็บค่าจำนวนเต็มหลายค่าในคอลัมน์สตริง ค่าทูเพิลแต่ละค่าควรเก็บไว้ในแถวแยกกัน

สำหรับคำถามของคุณ: ใน 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"