JSON值的比較和排序html
JSON值可使用=,<,<=,>,>=,<>,!=,和<=>運算符進行比較。mysql
JSON值尚不支持如下比較運算符和函數:sql
●BETWEENjson
●IN()數組
●GREATEST()ide
●LEAST()函數
要想使用上面這些列出的比較運算符和函數,一個解決方法是將JSON值轉換爲原生MySQL數值或字符串數據類型,以便它們具備一致的非JSON標量類型。優化
JSON值的比較在兩個級別進行。第一級比較基於所比較值的JSON類型。若是類型不一樣,則比較結果僅由哪一個類型具備更高的優先級來肯定。若是這兩個值具備相同的JSON類型,則使用特定於類型的規則進行第二級比較。編碼
下面的列表顯示了JSON類型的優先級,從最高優先級到最低優先級。(類型名是由JSON_TYPE()函數返回的類型)同一行中顯示的類型具備相同的優先級。列表中前面列出的JSON類型的值都比列表中後面列出的JSON類型的值大。3d
對於具備相同優先級的JSON值,比較規則是依據於特定類型的:
●BLOB
比較兩個值的前N個字節,其中N是較短值的字節數。若是兩個值的前N個字節相同,則短值排在長值以前。
●BIT
與BLOB規則相同。
●OPAQUE
與BLOB規則相同。OPAQUE值是指不屬於其餘類型的值。
●DATETIME
表示較早時間點的值排在表示稍後時間點的值以前。若是兩個值最初分別來自MySQL DATETIME和TIMESTAMP類型,那麼若是它們表示相同的時間點,那麼它們是相等的。
●TIME
兩個時間值中較小的一個排在較大的時間值以前。
●DATE
較早的日期排在較近的日期以前。
●ARRAY
若是兩個JSON數組的長度相同,而且數組中相應位置的值相等,則它們是相等的。
若是數組不相等,則它們的順序由第一個位置有差別的元素決定。該位置值較小的數組排在前面。若是較短數組的全部值都等於較長數組中的相應值,則較短數組排在前面。
例子:
●BOOLEAN
JSON false字面量小於JSON true字面量。
●OBJECT
若是兩個JSON對象具備相同的鍵集,而且每一個鍵在兩個對象中都具備相同的值,那麼它們是相等的。
例子:
●STRING
兩個字符串比較前N個字節,這些字節以utf8mb4編碼表示,並按照字典順序排列,其中N是較短字符串的長度。若是兩個字符串的前N個字節相同,則認爲較短的字符串比較長的字符串小。
例子:
此排序至關於使用排序規則utf8mb4_bin對SQL字符串進行排序。因爲utf8mb4_bin是二進制排序規則,所以JSON值的比較區分大小寫:
●INTEGER, DOUBLE
JSON值能夠包含精確的數值和近似的數值。
在JSON值中比較數字的規則與原生MySQL數值類型的比較規則有些不一樣:
■ 在分別使用原生MySQL INT和DOUBLE 數字類型的兩個列之間的比較中,全部比較都涉及一個整數和一個雙精度類型,所以全部行,整數都轉換爲雙精度類型。也就是說,精確的數值被轉換成近似的數值。
■ 另外一方面,若是查詢比較兩個包含數字的JSON列,則沒法預先知道數字是整數仍是雙精度。爲了在全部行中提供最一致的行爲,MySQL將近似值數字轉換爲精確值數字。結果排序是一致的,而且精確值不會丟失精度。例如,給定標量922337203685477580五、922337203685477580六、9223372036854775807和9.223372036854776e18,順序以下:
若是JSON比較使用非JSON數值比較規則,則可能會出現順序不一致的狀況。一般的MySQL數字比較規則會產生如下順序:
■ 整數比較:
■ 雙精度比較:
對於任何JSON值與SQL NULL的比較,結果是未知的。
爲了比較JSON和非JSON值,非JSON值根據下表的規則轉換爲JSON,而後按照前面的描述進行比較。
在JSON和非JSON值之間的轉換
下表彙總了MySQL在JSON值和其餘類型值之間轉換時遵循的規則:
JSON值的ORDER BY和GROUP BY處理基於如下原則:
●標量JSON值的排序使用與前面討論中相同的規則。
●對於升序排序,SQL NULL順序在全部JSON值(包括JSON null字面量)以前;對於降序排序,SQL NULL順序位於全部JSON值(包括JSON null字面量)以後。
●JSON值的排序鍵由max_sort_length系統變量的值綁定,所以第一個max_sort_length字節相同,以後纔不一樣的鍵被認定爲相等。
●當前不支持對非標量值進行排序,會出現警告。
對於排序,將JSON標量轉換爲其餘一些原生MySQL類型是有益的。例如,若是名爲jdoc的列包含JSON對象,該對象有一個成員由id鍵和非負值組成,則使用此表達式按id值排序:
若是有一個生成的列被定義爲使用與ORDER BY中相同的表達式,MySQL優化器會識別出這一點,並考慮將索引用於查詢執行計劃。
JSON值聚合
對於JSON值的聚合,SQL NULL值被忽略,就像在其餘數據類型中同樣。非NULL值將轉換爲數值類型並進行聚合,但MIN()、MAX()和GROUP_CONCAT()除外。若是JSON的值是數值標量,轉換成數字是有意義,儘管(取決於值)可能會發生截斷和精度損失。其餘JSON值轉換成數量可能不會產生有意義的結果。