Estou tentando inserir uma lista de palavras em uma coluna com o JSON
tipo:
create table my_table (
...
synonyms JSON
...
)
Minha consulta está assim:
INSERT into my_table (id, synonyms)
SELECT id, GROUP_CONCAT(DISTINCT synonyms) as synonyms from (
SELECT id, name1,name2, GROUP_CONCAT(DISTINCT name1) as synonyms
FROM products
GROUP BY id
UNION
SELECT id, name1,name2, GROUP_CONCAT(DISTINCT name2) as synonyms
FROM products
GROUP BY id
) t group by id;
Se executado sem o INSERT na linha um, a synonyms
coluna retorna uma lista de palavras separadas por vírgula:
id name1 name2 synonyms
------------------------------------
1 one a,b one,a,b
2 two c two,c
Eu quero inserir esses sinônimos como um JSON_ARRAY. No entanto, o INSERT falha quando as palavras individuais não são aspas duplas. Se eu adicionar JSON_ARRAY no meu select:
SELECT name1,name2,id, JSON_ARRAY(GROUP_CONCAT(DISTINCT synonyms)) ...
Obtenho o seguinte resultado:
name1 name2 synonyms
----------------------------
one a,b ["one,a,b"]
two c ["two,c"]
Quando o que eu quero é isso (para que possa ser inserido diretamente na synonyms
coluna):
name1 name2 synonyms
----------------------------
one a,b ["one","a","b"]
two c ["two","c"]
Existe uma maneira de fazer isso com SQL ou é melhor tratado no código do aplicativo?
Use
JSON_ARRAYAGG
() em vez deGROUP_CONCAT()
. - akinEstá disponível apenas em 5.7.22+
Tem um implícito
DISTINCT
? Eu não sei... se não, subconsulta comDISTINCT
ajudará.Você pode adicionar um
concat
dentro dogroup_concat
para conseguir isso, como neste exemplo:Consulta assim
retornará