簡體   English   中英

JSON包含空數組的MySQL

[英]MySQL where JSON contains empty array

如何在JSON列中搜索空數組?

假設我有一個config列,有時其JSON等於{"tier": []}

WHERE JSON_CONTAINS(config, '', '$.tier') = 1

要么

WHERE JSON_CONTAINS_PATH(config, 'one', '$.tier') = NULL

沒有返回任何結果。 有什么我想念的嗎?

我一直在四處尋找具體的答案,但是在SO或MySQL文檔上找不到任何東西。

在MySQL 5.7.24上進行測試的方法有以下兩種:

mysql 5.7.24> select config from mytable 
  where json_contains(config, cast('[]' as json), '$.tier');
+--------------+
| config       |
+--------------+
| {"tier": []} |
+--------------+

mysql 5.7.24> select config from mytable 
  where json_contains_path(config, 'one', '$.tier');
+--------------+
| config       |
+--------------+
| {"tier": []} |
+--------------+

我找到了另一個解決方案,它有助於嚴格檢查是否為空數組:

首先,請看我有兩行,一個有一個非空數組:

mysql 5.7.24> select config from mytable 
  where json_contains(config, json_array(), '$.tier');
+----------------------------------------+
| config                                 |
+----------------------------------------+
| {"tier": []}                           |
| {"tier": [{"name": "BK", "value": 8}]} |
+----------------------------------------+
2 rows in set (0.00 sec)

現在,我確認數組的長度為0,以確認其為空:

mysql 5.7.24> select config from mytable 
  where json_contains(config, json_array(), '$.tier') 
  and json_length(config, '$.tier') = 0; 
+--------------+
| config       |
+--------------+
| {"tier": []} |
+--------------+
1 row in set (0.00 sec)

如果保證tier為數組,則可以使用JSON_CONTAINS_PATH檢查 0 項目是否存在:

SELECT JSON_CONTAINS_PATH('{"tier": []}',             'one', '$.tier[0]'); -- 0
SELECT JSON_CONTAINS_PATH('{"tier": ["foo"]}',        'one', '$.tier[0]'); -- 1
SELECT JSON_CONTAINS_PATH('{"tier": ["foo", "bar"]}', 'one', '$.tier[0]'); -- 1

交替使用JSON_LENGTH

SELECT JSON_LENGTH('{"tier": []}',             '$.tier'); -- 0
SELECT JSON_LENGTH('{"tier": ["foo"]}',        '$.tier'); -- 1
SELECT JSON_LENGTH('{"tier": ["foo", "bar"]}', '$.tier'); -- 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM