Mysql

Mysql:使用 GROUP_CONCAT 插入 JSON 列類型

  • December 23, 2020

我正在嘗試將單詞列表插入到具有以下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;

如果在第一行沒有 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 做到這一點,還是在應用程式碼中更好地處理?

使用JSON_ARRAYAGG()代替GROUP_CONCAT(). -秋名

它僅在 5.7.22+ 中可用

它有隱含的DISTINCT嗎?我不知道……如果沒有,子查詢DISTINCT會有所幫助。

您可以在concat內部添加一個group_concat來實現這一點,就像在這個範例中一樣:

SELECT name1, name2, id, 
      CONCAT(
         '[',
         GROUP_CONCAT(
            CONCAT(
               '"',
               synonyms,
               '"'
            )
         ),
         ']'
      ) 

引用自:https://dba.stackexchange.com/questions/238656