No MySQL versão 8.0.19, como dividir string em colunas, pois algumas funções mais antigas não estão disponíveis, como índice de caracteres (), string_split () [duplicate]

Dec 29 2020

Eu tenho uma linha que gostaria de dividir em colunas, por exemplo, o nome da coluna é Código com a linha mostrando 01,04,07 para itens de produtos.

Quero dividir os itens do produto em colunas. Qualquer sugestão seria útil, pois tentei as funções mais antigas, mas percebi que a versão SQL em que estou trabalhando não tem essas opções, como string_split e índice de caracteres. Eu usei instr()e, substring()mas um comprador pode comprar mais ou menos itens do que os mostrados acima.

Respostas

1 GMB Dec 29 2020 at 05:15

Seu problema imediato é seu design. Você não deve armazenar vários valores inteiros em uma coluna de string. Cada tupla de valores deve ser armazenada em uma linha separada.

Quanto à sua pergunta: na versão recente do MySQL, uma opção é JSON. Pode ser mais prático colocar os valores em linhas do que em colunas. Aqui está uma maneira de fazer isso:

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

Se você quiser os resultados como colunas, uma opção é a agregação condicional; você precisa enumerar quantas colunas forem necessárias:

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"