如何将所有字符串更新为 JSON 数组

How to update all string into JSON array

我正在寻找一种方法来更新或更好地在我的情况下将每个值连接到一个 JSON 数组中。所有的值都是字符串。 我知道在更简单的情况下我可以做,来替换,比如:

SELECT JSON_REPLACE('[1, 2, 3]', '$[0]', 9) AS 'Result';

这会将第一个字段替换为 9;但是有一种方法可以将每个值与固定字符串连接起来吗?我知道这是不正确的,但类似于:

SELECT JSON_REPLACE('[1, 2, 3]', '$[*]', concat($[*], 'fixed')) AS 'Result';

获得

'["1fixed", "2fixed", "3fixed"]

谢谢!

mysql> select json_arrayagg(concat(val, 'fixed')) as result 
  from json_table('[1, 2, 3]', '$[*]' columns (val int path '$')) as j;
+--------------------------------+
| result                         |
+--------------------------------+
| ["1fixed", "2fixed", "3fixed"] |
+--------------------------------+

MySQL JSON_TABLE() 函数需要 8.0。 MySQL JSON_ARRAYAGG() 函数需要 5.7 或更高版本。

如果这看起来很复杂,抱歉,但这是将数据存储为 JSON 字符串,然后尝试对字符串中的值使用 SQL 表达式的结果。这肯定会很尴尬,因为您正在实现一个名为 Inner-Platform Effect.

的反模式

如果您不将数据存储为 JSON 数组,而是以正常形式存储数据,每行一个值,这会容易得多。

您可以使用以下查询,其中包括一些 JSON 函数,同时通过使用一种行生成技术(例如

提取数组的元素
SELECT JSON_ARRAYAGG(
                     JSON_EXTRACT(
                                  JSON_REPLACE(json, 
                                               j, 
                                               CONCAT(JSON_EXTRACT(json,j),'fixed')
                                               ), 
                                               j
                                 )
                     ) AS Result
  FROM
  (SELECT @i := @i + 1 AS i, json, CONCAT('$[',@i-1,']') AS j                 
     FROM t
     JOIN (SELECT @i := 0 FROM t) AS k
     JOIN information_schema.tables ) AS jj
  WHERE i <= JSON_LENGTH(json)

Demo

前提是数据库版本至少为 5.7