W MySQL w wersji 8.0.19 jak podzielić ciąg na kolumny, ponieważ niektóre starsze funkcje nie są dostępne, takie jak indeks znaków (), string_split () [duplicate]

Dec 29 2020

Mam jeden wiersz, który chciałbym podzielić na kolumny, na przykład nazwa kolumny to Kod z wierszem zawierającym 01,04,07 dla pozycji produktu.

Chcę podzielić produkty na kolumny. Wszelkie sugestie byłyby pomocne, ponieważ wypróbowałem starsze funkcje, ale zdałem sobie sprawę, że wersja SQL, nad którą pracuję, nie ma tych opcji, takich jak string_split i indeks znaków. Użyłem instr()i substring()kupujący może kupić więcej lub mniej przedmiotów niż pokazano powyżej.

Odpowiedzi

1 GMB Dec 29 2020 at 05:15

Twoim bezpośrednim problemem jest projekt. Nie należy przechowywać wielu wartości całkowitych w kolumnie łańcuchowej. Każda krotka wartości powinna być przechowywana w osobnym wierszu.

Jeśli chodzi o twoje pytanie: w najnowszej wersji MySQL opcją jest JSON. Wygodniejsze może być umieszczanie wartości w wierszach, a nie w kolumnach. Oto jeden sposób, aby to zrobić:

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

Jeśli chcesz, aby wyniki były kolumnami, jedną z opcji jest agregacja warunkowa; musisz wyliczyć tyle kolumn, ile potrzeba:

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"