JSON
タイプの列に単語のリストを挿入しようとしています:
create table my_table (
...
synonyms JSON
...
)
私のクエリは次のようになります:
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;
1行目のINSERTなしで実行すると、synonyms
列はコンマ区切りの単語のリストを返します。
id name1 name2 synonyms
------------------------------------
1 one a,b one,a,b
2 two c two,c
これらの同義語をJSON_ARRAYとして挿入したいと思います。ただし、個々の単語が二重引用符で囲まれていない場合、INSERTは失敗します。私の選択にJSON_ARRAYを追加した場合:
SELECT name1,name2,id, JSON_ARRAY(GROUP_CONCAT(DISTINCT synonyms)) ...
次の結果が得られます。
name1 name2 synonyms
----------------------------
one a,b ["one,a,b"]
two c ["two,c"]
私が欲しいのはこれです(つまり、synonyms
列に直接挿入できます):
name1 name2 synonyms
----------------------------
one a,b ["one","a","b"]
two c ["two","c"]
SQLでこれを行う方法はありますか、それともアプリケーションコード内でより適切に処理されますか?
GROUP_CONCAT()
の代わりに JSON_ARRAYAGG
() を使用します。 - アキナ
5.7.22+でのみ使用可能です
暗黙のDISTINCT
はありますか?わかりません...そうでない場合は、DISTINCT
を使用したサブクエリが役立ちます。
このサンプルのように、group_concat
内にconcat
を追加してこれを実現できます。
SELECT name1, name2, id,
CONCAT(
'[',
GROUP_CONCAT(
CONCAT(
'"',
synonyms,
'"'
)
),
']'
)