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 中)然后执行 INSERT
或INSERT 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
每个值并立即插入它,或者再次构建准备好的语句。
我得到一个带有 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 中)然后执行 INSERT
或INSERT 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
每个值并立即插入它,或者再次构建准备好的语句。