MySql 5.7按键json_extract

use*_*349 4 mysql json

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

表数据

id params
1  {"company1X":{"price":"1124.55"},"company2X":{"price":"1,124.55"},"company3X":{"price":""},"company4X":{"price":""},"company5X":{"price":"1528.0"}}
Run Code Online (Sandbox Code Playgroud)

我不知道在我的请求中使用"公司"的名称.

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

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

Sch*_*ern 9

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

$.*将获得JSON对象中的所有元素,因此$.*.price获取所有价格的JSON数组.

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

现在有一个问题.就SQL而言,这是一行.它无法按正常排序order by,适用于行.

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


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

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

因此,应谨慎使用JSON列; 通常当您不确定需要存储哪种数据时.将要搜索和排序的"价格"等重要信息应作为普通列进行.

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