按JSON字段值排序

Maj*_*Afy 12 mysql json

我有一个像这样的json值的表:

-表格1

id    |   name   |   data
------+----------+---------------
1     | Test     | {"city_id": 3, "email":"test@test.com", "city_name":"something"}
2     | Test 2   | {"city_id": 1, "email":"test2@test2.com", "city_name":"another"}
3     | Test 3   | {"city_id": 6, "email":"test3@test3.com", "city_name":"blahblah"}
Run Code Online (Sandbox Code Playgroud)

现在我想要SELECT记录order by data.city_name,所以我使用这段代码:

SELECT id, name, JSON_EXTRACT(data, 'city_name') AS cityName
FROM table1
ORDER BY cityName ASC
Run Code Online (Sandbox Code Playgroud)

但是这个查询无法正确排序我的记录!

PS:city_name有UTF-8字符.

Sud*_*oti 15

您似乎没有正确使用JSON_EXTRACT(),请尝试:

SELECT id, name, JSON_EXTRACT(data, '$.city_name') AS cityName 
FROM demo ORDER BY cityName ASC
Run Code Online (Sandbox Code Playgroud)

演示小提琴


aco*_*tos 9

我通常JSON 值 ( ->> ) 转换为正确的类型以便正确排序:

SELECT id, name, data->>'$.city_name' AS cityName
FROM table1
ORDER BY CAST(cityName AS CHAR) ASC
Run Code Online (Sandbox Code Playgroud)

否则,您最终将排序为 blob(二进制),它们被视为二进制字符串(字节字符串),因此它们具有二进制字符集和排序规则,并且比较和排序基于列值中字节的数值(参考)。


xra*_*ray 7

我认为最简单的方法

SELECT * FROM YourTable order by data->"$.city_name" desc
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案,因为其他答案会在结果中添加额外的字段 (2认同)

Mr.*_*ale 1

检查这个。

SELECT Id ,name,SUBSTRING_INDEX(SUBSTRING_INDEX(data,'city_name":"',-1),'"',1) as CITY
FROM tempjson
order by SUBSTRING_INDEX(SUBSTRING_INDEX(data,'city_name":"',-1),'"',1)
Run Code Online (Sandbox Code Playgroud)

输出 :

在此输入图像描述