下面是我的情景:
CREATE TABLE `CustomerOrder` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
`data` json DEFAULT NULL,
PRIMARY KEY (`id`)
);
我们可以使用此Customer Order json作为示例:
{
"creation": "2015-07-30 14:27:51",
"customer": {
"id": 2,
"email": "foo@bar.com"
},
"item": [
{
"sku": 182,
"unitPrice": 0.89,
"qty": 10
}, {
"sku": 712,
"unitPrice": 12.99,
"qty": 2
}
]
}
在MySQL控制台上运行此SQL:
SELECT json_extract(data, '$.item[*].unitPrice') AS price FROM CustomerOrder
;
我将得到这个输出:
[ 0.89, 12.99 ]
现在我如何评估项目的[0.89 + 12.99]或1..N元素的总和?
对于我的测试,我使用了此版本的MySQL实验室:
http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/
答案 0 :(得分:3)
我尝试使用@ Rick的回答,但它对我没用。所以我挖掘了mysql函数的mysql文档。这是mysql 5.7.14的工作函数,
create function sum_array_cells( input_array json )
returns double
BEGIN
DECLARE array_length INTEGER(11);
DECLARE retval DOUBLE(19,2);
DECLARE cell_value DOUBLE(19,2);
DECLARE idx INT(11);
SELECT json_length( input_array ) INTO array_length;
SET retval = 0.0;
SET idx = 0;
WHILE idx < array_length DO
SELECT json_extract( input_array, concat( '$[', idx, ']' ) )
INTO cell_value;
SET retval = retval + cell_value;
SET idx = idx + 1;
END WHILE;
RETURN retval;
END
然后使用@Rick编写的函数:
select sum_array_cells( '[ 0.89, 12.99, 5.23, 2.04 ]' );
答案 1 :(得分:2)
以下存储的函数对我有用:
delimiter $$
create function sum_array_cells( input_array json )
returns double
language sql deterministic contains sql
begin
declare array_length integer;
declare retval double;
declare cell_value double;
declare idx int;
select json_length( input_array ) into array_length;
set retval = 0.0;
set idx = 0;
while idx
Then you would invoke that function in a query like this
select sum_array_cells( '[ 0.89, 12.99, 5.23, 2.04 ]' );
希望这有帮助, -Rick
答案 2 :(得分:1)
试试这个:
SELECT (json_extract(data, '$.item[0].unitPrice') + json_extract(data, '$.item[1].unitPrice')) AS price FROM CustomerOrder
答案 3 :(得分:1)
MySQL还不支持表函数(希望很快!),因此我们没有方便的JSON函数来从JSON数组生成行。目前,Victor Smt使用存储过程的建议也是我的偏好。
DagW
答案 4 :(得分:1)
不知道为什么我的代码示例被截断了。这是功能的其余部分:
select json_extract( input_array, concat( '$[', idx, ']' ) )
into cell_value;
set retval = retval + cell_value;
set idx = idx + 1;
end while;
return retval;
end$$
答案 5 :(得分:0)
使用JSON_TABLE参见示例:
SET @datax = '[
{ "product":"apple", "price": 5},
{ "product":"banana", "price": 7}
]';
SELECT price.*
FROM
JSON_TABLE(@datax, '$[*]' COLUMNS (
price INTEGER PATH '$.price')
) price;`
然后,加价。
答案 6 :(得分:0)
的优化和更新版本。 在 MySQL 5.7、MySQL 8.0 和 MariaDB 10.3 上测试。
请注意,为了准确起见,它使用十进制。随意将其更改为 double 或 int。
def index
@items = Item.all.includes(:responsible).includes(category: :default_responsible)
用法:
CREATE FUNCTION zy_json_sum ( js_array json )
RETURNS decimal(18,2) DETERMINISTIC
BEGIN
DECLARE total decimal(18,2) DEFAULT 0.0;
DECLARE idx int DEFAULT 0;
SELECT json_length( js_array ) INTO idx;
WHILE idx > 0 DO
SET idx = idx - 1;
SELECT json_extract( js_array, concat( '$[', idx, ']' ) ) + total INTO total;
END WHILE;
RETURN total;
END