MySql 5.7按键json_extract

时间:2017-06-01 18:13:15

标签: mysql json

我有一张桌子,如下所示:

表格数据

id params
1  {"company1X":{"price":"1124.55"},"company2X":{"price":"1,124.55"},"company3X":{"price":""},"company4X":{"price":""},"company5X":{"price":"1528.0"}}

我不知道在我的请求中使用“公司”的名称。

如何获取按价格订购的数据? 谢谢!

P.S我尝试从数据中选择json_extract(params,'$ [*] .price')但它不起作用(返回空值)。

1 个答案:

答案 0 :(得分:8)

$[*]获取JSON数组的所有元素,而不是对象。这是一个对象,所以你得到NULL。

$.*将获取JSON对象中的所有元素,因此$.*.price会为您提供所有价格的JSON数组。

mysql> select json_extract(params, '$.*.price') from foo;
+-------------------------------------------+
| json_extract(params, '$.*.price')         |
+-------------------------------------------+
| ["1124.55", "1,124.55", "", "", "1528.0"] |
+-------------------------------------------+

现在有问题了。就SQL而言,这是一行。它不能使用正常的order by进行排序,它适用于行。

MySQL没有排序JSON的功能......所以你被困住了。您可以返回JSON数组,并让接收数据的任何内容进行排序。您可能可以编写存储过程来对数组进行排序......但是,支持糟糕的表设计需要做很多工作。相反,请更改表格。

真正的问题是这是对JSON列的错误使用。

JSON列击败了SQL数据库的大部分内容(在PostgreSQL中更少,JSON支持更好)。 SQL数据库使用行和列,但JSON将多行和列推送到单个单元格中。

出于这个原因,应该谨慎使用JSON列;通常当您不确定需要存储哪种数据时。将要搜索和排序的“价格”等重要信息应作为普通列进行。

您需要将表更改为普通的SQL表,其中包含公司名称和价格的列。然后,您可以使用order by等常规SQL功能,性能将从索引中受益。您的问题中没有足够的信息来建议该表格可能是什么样的。