mariadb json 解码

mariadb json decode

我得到一个带有 JSON 个数组的文本列。

+-------------------------------------------------------------------------+
| code                                                                    |
+-------------------------------------------------------------------------+
| []                                                                      |
| ["5020","6420"]                                                         |
| ["4645","4775"]                                                         |
| ["6820"]                                                                |
| ["2442","2511"]                                                         |
| ["4675"]                                                                |
| ["1814","6201","6203","6209","6312","6399","7022","7311","7312","7320"] |
| ["6910","6920"]                                                         |
| ["4321","4329","4652","7112"]                                           |
| ["4332","7739"]                                                         |
+-------------------------------------------------------------------------+

我需要将这些代码作为单个整数值发送到另一个 table。一旦有数百万条记录,我不想将这些记录提取到 php/ruby/etc 以完成此任务。我想用 SQL.

在 MariaDB 中创建它

问题是这样的查询有什么好的方法?

没有。 SQL 代码会很乱,整体上会更糟。

我会读取 100-1000 行的块中的 table,遍历数组以获取数字,去重(在 php/etc 中)然后执行 INSERTINSERT IGNORE进入目标table.

分块技巧(针对 DELETE,但适应 table SELECT):http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

对于PHP。你可以使用它

$re = '/\d+/m';
$str = '+-------------------------------------------------------------------------+
| code                                                                    |
+-------------------------------------------------------------------------+
| []                                                                      |
| ["5020","6420"]                                                         |
| ["4645","4775"]                                                         |
| ["6820"]                                                                |
| ["2442","2511"]                                                         |
| ["4675"]                                                                |
| ["1814","6201","6203","6209","6312","6399","7022","7311","7312","7320"] |
| ["6910","6920"]                                                         |
| ["4321","4329","4652","7112"]                                           |
| ["4332","7739"]                                                         |
+-------------------------------------------------------------------------+';

preg_match_all($re, $str, $matches);

// Print the entire match result
print_r($matches);

结果:

Array
(
    [0] => Array
        (
            [0] => 5020
            [1] => 6420
            [2] => 4645
            [3] => 4775
            [4] => 6820
            [5] => 2442
            [6] => 2511
            [7] => 4675
            [8] => 1814
            [9] => 6201
            [10] => 6203
            [11] => 6209
            [12] => 6312
            [13] => 6399
            [14] => 7022
            [15] => 7311
            [16] => 7312
            [17] => 7320
            [18] => 6910
            [19] => 6920
            [20] => 4321
            [21] => 4329
            [22] => 4652
            [23] => 7112
            [24] => 4332
            [25] => 7739
        )

)

你应该做

$str = Result (MYSQL JSON)

尽情享受吧。

除了第一个发布的关于分块阅读 table 的答案外,还有一些其他可能的解决方案:

1) 如果需要做一次或很少做,我会选择低技术方法:

  • select code 到输出文件;
  • 运行 一个简单的 sed (去掉方括号并用新行替换逗号,这样每行得到一个数字,引号无关紧要);
  • 将文件加载到 table。

2) 如果你真的只想坚持使用 SQL,应该有一个程序:

  • 使用光标遍历每一行;
  • 使用子字符串替换将类数组字符串["1","2"]转换为类值字符串(1),(2)——很简单,虽然有点难看;
  • 将结果字符串附加到 INSERT INTO <table name> VALUES;
  • 运行 它作为准备好的语句;

3) 如果你想花哨和实验(假设它不是生产),试试 MariaDB 10.2 中的 JSON 函数,也通过一个过程:

  • 使用光标遍历每一行;
  • 使用JSON_LENGTH获取数组中元素的个数;
  • 使用循环(例如 WHILE)依次 JSON_EXTRACT 每个值并立即插入它,或者再次构建准备好的语句。