MySQL 8.0.19 sürümünde karakter dizini (), string_split () [duplicate] gibi bazı eski işlevler kullanılamadığından dizeyi sütunlara nasıl böleriz

Dec 29 2020

Sütunlara bölmek istediğim bir satırım var, örneğin sütun adı Kod, satır ürün öğeleri için 01,04,07 gösteriyor.

Ürün öğelerini sütunlara ayırmak istiyorum. Eski fonksiyonları denediğim için herhangi bir öneri faydalı olacaktır, ancak üzerinde çalıştığım SQL sürümünün string_split ve karakter dizini gibi seçeneklere sahip olmadığını fark ettim. Kullandım instr()ve substring()ancak bir alıcı yukarıda gösterilenden daha fazla veya daha az ürün satın alabilir.

Yanıtlar

1 GMB Dec 29 2020 at 05:15

Acil probleminiz tasarımınızdır. Bir dize sütununda birden çok tamsayı değeri saklamamalısınız. Her bir değer grubu ayrı bir satırda saklanmalıdır.

Sorunuza gelince: son MySQL sürümünde bir seçenek JSON'dur. Değerleri sütunlardan ziyade satırlara koymak daha kolay olabilir. İşte bunu yapmanın bir yolu:

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

Sonuçların sütun olarak olmasını istiyorsanız, seçeneklerden biri koşullu toplamadır; gerektiği kadar sütunu numaralandırmanız gerekir:

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"