【mysql】mysql5.7支持的json字段查詢【mybatis】


mysql5.7支持的json字段查詢

參考:https://www.cnblogs.com/ooo0/p/9309277.html

參考:https://www.cnblogs.com/pfdltutu/p/9019444.html

 

使用示例:

存儲結構如下:

 

1.以json字段作為查詢條件:[json字段全部是JSONObject類型的]

SELECT
    * 
FROM
    worksheet_data_table_data w 
WHERE
    w.val -> '$.input_0' LIKE '%0%'

 

查詢結果:

 

 

 

2.判斷JSON字段,是JSONObject類型還是JSONArray類型

SELECT
    w.val,
    JSON_TYPE( w.val ) 
FROM
    worksheet_data_table_data w

 

查詢結果:

 

 

3.查詢JSON字段是 Array的JSON類型的

SELECT
    w.val,
    JSON_TYPE( w.val ) 
FROM
    worksheet_data_table_data w

where 
JSON_TYPE(w.val) = 'ARRAY'

 

查詢結果:

 

 

4.以json字段為查詢條件[查詢JSONArray]類型  [like查詢]

SELECT
    * 
FROM
    worksheet_data_table_data w 
WHERE
    w.val -> '$[*].*' LIKE '%峰%'

解釋:

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

1.w.val字段是JSON數組[無所謂JSONObject還是JSONArray]
[反正如果按照對象查,那數組是匹配不到的]
[反之,如果按照數組查,對象也是匹配不到的]


2.'$[*].*' 
代表查詢JSONArray 數組格式的JSON字符串中,
第一個*  代表任意下標
第二個* 代表任意屬性


3.LIKE '%峰%'
匹配條件和正常sql 查詢條件一樣 寫

 查詢結果如下:

 

5.以json字段為查詢條件[查詢JSONArray]類型  [=查詢]

 

等於查詢不同於like的查詢,需要在外面包裹一層JSON_CONTAINS()

 

比如數據集如下:

 

 想要 查詢 出 name字段  既等於"亞瑟"  又等於"jj"的json字段

SELECT
    id,
    `dept-user_0`
FROM
    worksheet_data_30  d
WHERE
    JSON_CONTAINS( d.`dept-user_0`->'$[*].name' ,  '"jj"', '$')
    
    AND
    
    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\"}]"
}

 

 

 查看正常字段,可以這么寫:

SELECT
    val,
    val -> '$.input_0'
FROM
    worksheet_data_table_data  
WHERE
    val -> '$.input_0' like '%o%'

 

在對於數據庫非JSON字段的列名查詢,如果有特殊符號的,可以使用``擴住,例如:

SELECT
`col_name`,
    val
FROM
    worksheet_data_table_data  
WHERE
    `col_name` = 'table_0'

 

 

但在查詢JSON字段時候,指定key時有特殊符號,就不能使用`` 反單引號擴住了,而應該采用""雙引號 擴住KEY查詢:

錯誤寫法:

SELECT
    val,
    val -> '$.`dept-user_0`'
FROM
    worksheet_data_table_data  
WHERE
    val -> '$.`dept-user_0`' like '%蓋倫%'

報錯:Invalid JSON path expression. The error is around character position 15.

 

 

正確寫法:

SELECT
    val,
    val -> '$."dept-user_0"'
FROM
    worksheet_data_table_data  
WHERE
    val -> '$."dept-user_0"' like '%蓋倫%'

結果:

 

 

 

7.以json字段為查詢條件[查詢JSONObject]類型  [key:value value是時間 的    時間區間和=查詢]

 

 

【注意:】

對於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,
    val -> '$."date_0"'
FROM
    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)

 

 

 

 

 

對於時間的=查詢:[其實也是用between and,只不過,區間結束時間往后算1天,這樣得到的就是今天到明天之前的所有時間數據]

SELECT
    val,
    val -> '$."date_0"'
FROM
    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-07', interval 1 day)

 

 

8.以json字段為查詢條件[查詢JSONObject]類型  [key:value value是數值 的    數值的 區間和=查詢]

 

 

數值的區間查詢【between 或者 > < 都可以】

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

 

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

 

 

 

 

數值=查詢

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM