mysql查詢json數據的指定內容

以下內容首發於我的個人博客網站:
http://riun.xyz


使用

在mysql5.7之後增加了對json數據的操作

具體json函數使用方法參考: https://blog.csdn.net/qq_21187515/article/details/90760337

現若有一表:test_common_tb

表中有一字段: callbackdata text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT ‘回調數據’,

和另一字段: statusid int(11) DEFAULT ‘1’ COMMENT ‘狀態: 0-處理成功 1-處理中 2-處理失敗’,

他們的邏輯是這樣的:statusid爲0的時候,callbackdata 字段必定有值,其他情況不確定是否有值。callbackdata 字段儲存json數據。

callbackdata 字段有值時的樣例:

{
	"productId": "P002",
	"bizId": "2001",
	"listingId": "1107_03",
	"flowId": "srgtwery5ergsdrfg",
	"auditResult": 0,
	"auditReason": "F01;",
	"statusId": 0,
	"statusDesc": "success"
}

現在若要查詢此字段中 auditReason 包含 F01 的數據,sql應該這樣寫:

正確示例:

SELECT * FROM `test_common_tb` 
where statusid = 0 and callbackdata->'$.auditReason' like '%F01%'

在實際查詢json數據時,如果不能保證所有記錄的此字段都儲存合規json數據,那麼就有可能查詢出錯,例如上述字段callbackdata可能存在值也可能不存在,所以不能直接這樣查詢:

錯誤示例:

SELECT * FROM `test_common_tb` 
where callbackdata->'$.auditReason' like '%F01%'

這樣會出現錯誤:

The JSON binary value contains invalid data.

因爲當字段爲空時mysql會認爲此字段不是合規的json數據,若某記錄中的此字段值不是合規的json數據,使用callbackdata->'$.auditReason' like '%F01%'去從這些記錄中條件查詢就會報錯。因此要先篩選出所有callbackdata字段爲合規的json數據的記錄,再去執行like的條件查詢。 我們上述的sql是依靠statusid去確定callbackdata字段存有合規的json數據

也可以使用如下sql語句查出所有字段爲合規的json數據的記錄:

select id , callbackdata, statusid from test_common_tb 
where json_valid(callbackdata) = 1

json_valid(callbackdata) = 0 表示不是合規的json數據json_valid(callbackdata) = 1表示是合規的json數據

另外當json數據中存在"userName": "\xe7\x8e\x8b\xe5\xb0\x8f\xe4\xba\x8c",這種亂碼時也會被認爲不是合規的json數據。

很多時候我們並沒有這樣一個statusid去確保另一個字段的值,因此要想根據儲存json字段的某Key的值去查詢符合規則的記錄,就要像下面這樣查:

SELECT * FROM test_common_tb
WHERE json_valid ( callbackdata ) = 1 and callbackdata -> "$.productId" = "P001"

上面查詢語句中where後面的條件順序不能改變。

若我們儲存的json數據存在多層關係時,想要查詢更深層的key,就需要將父級元素的Key全部寫上:

{
	"productId": "P002",
	"bizId": "2001",
	"listingId": "1107_03",
	"flowId": "sdfgsdfggds",
	"auditResult": 0,
	"auditReason": "F01;",
	"statusId": 0,
	"statusDesc": "success",
	"object": {
		"productId": "34545",
		"bizId": "1002",
		"listingId": "1234234ersf",
		"idNumber": "346235tw34563453",
		"idType": "100",
		"mobile": "345346",
		"userId": "zfdgsd",
		"cifNo": "3453453",
		"cifType": "234",
		"cstLevelCd": "432",
		"flowId": "sdfgsdfggds",
		"flowCount": 1
	}
}

callbackdata字段存在這樣的數據,而我現在要查詢idType爲100的記錄,那麼我的查詢語句應該是:

SELECT * FROM `test_common_tb` 
where json_valid ( callbackdata ) = 1 and callbackdata->'$.object.idType' = '100'

只寫callbackdata->'$.idType'='100'它只會在第一級key去尋找。

總結

查詢出column符合json規範的記錄:

SELECT * FROM `table_name` 
WHERE json_valid(column_name) = 1

1爲合規,0爲不合規。

通用的查詢儲存json數據的字段中key=value的記錄:

SELECT * FROM table_name
WHERE json_valid ( column ) = 1 and column -> "$.key" = "value"

查詢多級key時,需要將父級key全部寫上

SELECT * FROM `talbe_name` 
WHERE json_valid ( column ) = 1 and column_name->'$.key.key' = 'value'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章