mysql5.7支持的json字段查询

使用示例:

存储结构如下:

591b3dd5699b6c43a004a2001751d7a9.png

1.以json字段作为查询条件:[json字段全部是JSONObject类型的]

SELECT

*

FROMworksheet_data_table_data wWHEREw.val-> '$.input_0' LIKE '%0%'

查询结果:

5c91f303e2d25aa89073b3f8d7faba6b.png

2.判断JSON字段,是JSONObject类型还是JSONArray类型

SELECTw.val,

JSON_TYPE( w.val )FROMworksheet_data_table_data w

查询结果:

1a1d0a70ca721cbbe298462424b18127.png

3.查询JSON字段是 Array的JSON类型的

SELECTw.val,

JSON_TYPE( w.val )FROMworksheet_data_table_data wwhereJSON_TYPE(w.val)= 'ARRAY'

查询结果:

40cc9f0e7d6aaa7c062e665f22eabec0.png

4.以json字段为查询条件[查询JSONArray]类型  [like查询]

SELECT

*

FROMworksheet_data_table_data wWHEREw.val-> '$[*].*' LIKE '%峰%'

解释:

w.val -> '$[*].*' LIKE '%峰%'

1.w.val字段是JSON数组[无所谓JSONObject还是JSONArray]

[反正如果按照对象查,那数组是匹配不到的]

[反之,如果按照数组查,对象也是匹配不到的]

2.'$[*].*'代表查询JSONArray 数组格式的JSON字符串中,

第一个*代表任意下标

第二个*代表任意属性3.LIKE '%峰%'匹配条件和正常sql 查询条件一样 写

查询结果如下:

9fedb518ca974aee05032f01487f0fd0.png

5.以json字段为查询条件[查询JSONArray]类型  [=查询]

等于查询不同于like的查询,需要在外面包裹一层JSON_CONTAINS()

比如数据集如下:

23aa712a39f340630dae1efb0e4abc58.png

想要 查询 出 name字段  既等于"亚瑟"  又等于"jj"的json字段

SELECTid,

`dept-user_0`FROMworksheet_data_30 dWHEREJSON_CONTAINS( d.`dept-user_0`->'$[*].name' , '"jj"', '$')ANDJSON_CONTAINS( d.`dept-user_0`->'$[*].name' , '"亚瑟"', '$')

查询结果如下:

e0ceef096c157de4e7879fe0110304b0.png

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\"}]"

}

36b782219907799b60e3a0d9b7cb58d4.png

查看正常字段,可以这么写:

SELECTval,

val-> '$.input_0'

FROMworksheet_data_table_dataWHEREval-> '$.input_0' like '%o%'

0f5b1cd68ffee8ef636d8448317403ea.png

在对于数据库非JSON字段的列名查询,如果有特殊符号的,可以使用``扩住,例如:

SELECT`col_name`,

valFROMworksheet_data_table_dataWHERE`col_name` = 'table_0'

5021da3fed69320959531f4ae98cf982.png

但在查询JSON字段时候,指定key时有特殊符号,就不能使用`` 反单引号扩住了,而应该采用""双引号 扩住KEY查询:

错误写法:

SELECTval,

val-> '$.`dept-user_0`'

FROMworksheet_data_table_dataWHEREval-> '$.`dept-user_0`' like '%盖伦%'

报错:Invalid JSON path expression. The error is around character position 15.

f1d508edaab53dc3d466d8bab7678c2c.png

正确写法:

SELECTval,

val-> '$."dept-user_0"'

FROMworksheet_data_table_dataWHEREval-> '$."dept-user_0"' like '%盖伦%'

结果:

ca86008bd402ed964d1a68a4957127df.png

7.以json字段为查询条件[查询JSONObject]类型  [key:value value是时间 的    时间区间和=查询]

f85ec2782fae046f5fa34218ece452d4.png

【注意:】

对于JSON字符串中的时间格式的存储,需要统一格式,要么都是"%Y-%m-%d" , 要么都是“%Y-%m-%d %H:%i:%s” 或者其他,但只有保证时间存入的格式是一致的,

才能使用 字符串转时间的函数 ,按照统一的时间格式 进行转化,否则转换不成功,即不能准确查询出结果。

STR_TO_DATE(val -> '$.date_0','"%Y-%m-%d %H:%i:%s"')

对于时间的区间查询:[需要在区间结束时间往后算1天,这样才能保证查询的准确性]

SELECTval,

val-> '$."date_0"'

FROMworksheet_data_table_dataWHERESTR_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)

8685f55185e2ca4fc72d54f5e4cd4917.png

对于时间的=查询:[其实也是用between and,只不过,区间结束时间往后算1天,这样得到的就是今天到明天之前的所有时间数据]

SELECTval,

val-> '$."date_0"'

FROMworksheet_data_table_dataWHERESTR_TO_DATE(val-> '$.date_0','"%Y-%m-%d %H:%i:%s"') between '2019-08-07 10:33:06' AND date_add('2019-08-07', interval 1 day)

1971ad10ba4f5aaa115af17c1634fbef.png

8.以json字段为查询条件[查询JSONObject]类型  [key:value value是数值 的    数值的 区间和=查询]

72c200ca9b4089a68c94be4b6ff86b3e.png

数值的区间查询【between 或者 >

SELECTval,

val-> '$."input-number_0"',CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))FROMworksheet_data_table_dataWHERE

CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) between 16 and 18

SELECTval,

val-> '$."input-number_0"',CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))FROMworksheet_data_table_dataWHERE

CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) >16.3

46e68b0dd7084b24982a73923f54fb4f.png

数值=查询

SELECTval,

val-> '$."input-number_0"',CAST(val -> '$."input-number_0"' AS DECIMAL(18,3))FROMworksheet_data_table_dataWHERE

CAST(val -> '$."input-number_0"' AS DECIMAL(18,3)) =16

802dcae0c44d00ad7c2fc2b6bda74629.png

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐