如何将带有列表的 JSON 数据转换为使用动态列的 MariaDB SQL 插入语句

How to convert JSON data with a list into an MariaDB SQL Insert statement that uses dynamic columns

是否可以像下面使用动态列的示例那样在 MariaDB 中存储 JSON 列表字段:

{
  "myfield": "value1",
  "myList": ["item1" , "item2", "item3"]
}

遗憾的是,MariaDB 动态列本身不支持 JSON 数组列表,尽管这是一个解决方案,并且可以更好地使用 INTEGERS,但您可以尝试使用字符串。

 ALTER TABLE `your_table` ADD COLUMN `dynamic_column` BLOB NULL DEFAULT
 NULL ;

您将数组列表作为字符串存储在动态列中

INSERT INTO 
            your_table (dynamic_column) 
VALUES      
            (COLUMN_CREATE('myfield','value1'
                          ,'myList','["item1" , "item2", "item3"]') 
            );

UPDATE 
        your_table
    SET
        dynamic_column = COLUMN_CREATE('myfield','value1'
                                      ,'myList','["item1" , "item2", "item3"]'
                                      )
    WHERE 
            id = your_id ;

到目前为止一切顺利,现在是棘手的部分。如何在不破坏格式的情况下 return。使用替换函数:

SELECT REPLACE(REPLACE(COLUMN_JSON(dynamic_column),'"[','['),']"',']') FROM your_table ;

您也可以在不创建任何 table.

的情况下快速测试输出
SET @tmp= COLUMN_CREATE('myfield','value1','myList','[ "item1"  , "item2" , "item3" ]' ) ;

 SELECT REPLACE(REPLACE(COLUMN_JSON(@tmp),'"[','['),']"',']') json_string;

如果它输出破坏 json 格式的 '\' :

+----------------------------------------------------------------------+
| json_string                                                          |
+----------------------------------------------------------------------+
| {"myList":[ \"item1\"  , \"item2\" , \"item3\" ],"myfield":"value1"} |
+----------------------------------------------------------------------+

然后试试

 SELECT REPLACE(REPLACE(REPLACE(COLUMN_JSON(@tmp),'"[','['),']"',']'),'\','') json_string;
+----------------------------------------------------------------+
| json_string                                                    |
+----------------------------------------------------------------+
| {"myList":[ "item1"  , "item2" , "item3" ],"myfield":"value1"} |
+----------------------------------------------------------------+

试一试!!

** 不要忘记在任何在线验证器或文本编辑器(如 textwrangler 或记事本++)上验证 json 字符串输出

** 请注意,有时动态列可能会带来动态痛苦

干杯

CAST 可以替换为 JSON_MERGE('{"key": "val"}', JSON_OBJECT());