mysql5.7支持的json字段查询
参考:
https://www.cnblogs.com/ooo0/p/9309277.html
参考:
https://www.cnblogs.com/pfdltutu/p/9019444.html
使用示例:
存储结构如下:
1.以json字段作为查询条件:[json字段全部是JSONObject类型的]
SELECT
worksheet_data_table_data w
WHERE
w.val -> '$.input_0' LIKE '%0%'
查询结果:
1
.w.val字段是JSON数组
[
无所谓JSONObject还是JSONArray
]
[
反正如果按照对象查,那数组是匹配不到的
]
[
反之,如果按照数组查,对象也是匹配不到的
]
2
.
'
$[*].*
'
代表查询JSONArray 数组格式的JSON字符串中,
第一个
*
代表任意下标
第二个
*
代表任意属性
3
.
LIKE
'
%峰%
'
匹配条件和正常sql 查询条件一样 写
查询结果如下:
5.以json字段为查询条件[查询JSONArray]类型 [=查询]
等于查询不同于like的查询,需要在外面包裹一层JSON_CONTAINS()
比如数据集如下:
想要 查询 出 name字段 既
等于
"亚瑟" 又
等于
"jj"的json字段
SELECT
`dept-user_0`
worksheet_data_30 d
WHERE
JSON_CONTAINS( d.`dept-user_0`->'$[*].name' , '"jj"', '$')
JSON_CONTAINS( d.`dept-user_0`->'$[*].name' , '"亚瑟"', '$')
查询结果如下:
6.以json字段为查询条件[查询JSONObject]类型 [包含特殊符号的KEY的查询,应使用" "双引号扩住]
json字段值如下格式:
{
"input_0":"lio",
"textarea_0":"多行文本",
"input-number_0":"17",
"date_0":"2019-08-07 09:33:06",
"select_0":",张三,李四,王五,",
"area_0":"qwdq4d8q4d8q4wd4",
"location_0":"48444",
"file_0":"451515151",
"dept-user_0":"[{\"id\":\"1\",\"name\":\"jz\"},{\"id\":\"2\",\"name\":\"盖伦\"},{\"id\":\"3\",\"name\":\"jj\"}]",
"dept-base_0":"[{\"id\":\"1\",\"name\":\"pj\"},{\"id\":\"2\",\"name\":\"游侠\"},{\"id\":\"3\",\"name\":\"jj\"}]"
}
【注意:】
对于JSON字符串中的时间格式的存储,需要统一格式,要么都是"%Y-%m-%d" , 要么都是“%Y-%m-%d %H:%i:%s” 或者其他,但只有保证时间存入的格式是一致的,
才能使用 字符串转时间的函数 ,按照统一的时间格式 进行转化,否则转换不成功,即不能准确查询出结果。
STR_TO_DATE(val -> '$.date_0','"%Y-%m-%d %H:%i:%s"')
对于时间的区间查询:[需要在区间结束时间往后算1天,这样才能保证查询的准确性]
SELECT
val -> '$."date_0"'
worksheet_data_table_data
WHERE
STR_TO_DATE(val -> '$.date_0','"%Y-%m-%d %H:%i:%s"') between '2019-08-07 10:33:06' AND date_add('2019-08-08', interval 1 day)
val
->
'
$."input-number_0"
'
,
CAST
(val
->
'
$."input-number_0"
'
AS
DECIMAL
(
18
,
3
))
worksheet_data_table_data
WHERE
CAST
(val
->
'
$."input-number_0"
'
AS
DECIMAL
(
18
,
3
))
between
16
and
18
SELECT
val -> '$."input-number_0"',
CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))
worksheet_data_table_data
WHERE
CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) >16.3
val
->
'
$."input-number_0"
'
,
CAST
(val
->
'
$."input-number_0"
'
AS
DECIMAL
(
18
,
3
))
worksheet_data_table_data
WHERE
CAST
(val
->
'
$."input-number_0"
'
AS
DECIMAL
(
18
,
3
))
=
16