[英]Retrieve property values from json array filtered on another property value
我有一個包含 json 數組的列 (column_metadata) 的表
[{
"ORDER": -1,
"READONLY": false,
"COLUMNNAME": "id",
"COLUMNTYPE": "int",
"FILTERABLE": false,
"SUMMARYVIEW": false,
"WHITELISTED": false
},
{
"ORDER": -1,
"READONLY": true,
"COLUMNNAME": "name",
"COLUMNTYPE": "varchar",
"FILTERABLE": true,
"SUMMARYVIEW": true,
"WHITELISTED": true
},
{
"ORDER": -1,
"READONLY": false,
"COLUMNNAME": "description",
"COLUMNTYPE": "varchar",
"FILTERABLE": true,
"SUMMARYVIEW": true,
"WHITELISTED": true
}]
我正在嘗試獲取WHITELISTED
為真的所有COLUMNNAME
列表。 我從 myTable 得到了select json_extract(column_metadata, '$[*].COLUMNNAME') from myTable
它返回了所有返回的列名,用逗號分隔。
但是,當我添加一個 where 子句時
select json_extract(column_metadata, '$[*].COLUMNNAME') from myTable
WHERE json_extract(column_metadata, '$[*].WHITELISTED') = true;
它不返回任何東西。 我們如何構造帶有 json_extract 的 where 子句?
編輯:我正在使用 MySQL 5.7,所以 JSON_TABLE() 不可用
您不能使用 JSON_EXTRACT() 執行此操作。 通常,JSON_EXTRACT() 不能很好地搜索 JSON 個對象的 arrays 個字段。 您可以給 JSON_EXTRACT() 一個路徑,您不能使用 JSON_EXTRACT() 在標量上下文中生成數組結果,這是您在假設的(非工作)SQL 查詢中顯示的內容。
你需要的是JSON_TABLE() ,它在 MySQL 8.0 中引入:
SELECT j.COLUMNNAME
FROM mytable, JSON_TABLE(mytable.column_metadata, '$[*]' COLUMNS(
`ORDER` SMALLINT PATH '$.ORDER',
READONLY BOOL PATH '$.READONLY',
COLUMNNAME VARCHAR(64) PATH '$.COLUMNNAME',
COLUMNTYPE VARCHAR(20) PATH '$.COLUMNTYPE',
FILTERABLE BOOL PATH '$.FILTERABLE',
SUMMARYVIEW BOOL PATH '$.SUMMARYVIEW',
WHITELISTED BOOL PATH '$.WHITELISTED'
)) AS j
WHERE j.WHITELISTED = true
給定示例數據的結果:
+-------------+
| COLUMNNAME |
+-------------+
| name |
| description |
+-------------+
在我看來,JSON_TABLE() 是一個 PITA。 每次要在 JSON 數據的特定字段中搜索特定值時,都必須寫出冗長、復雜的語法。
使用普通表和列而不是 JSON 會容易得多。
CREATE TABLE column_metadata (
`ORDER` SMALLINT,
READONLY BOOL,
COLUMNNAME VARCHAR(64),
COLUMNTYPE VARCHAR(20),
FILTERABLE BOOL,
SUMMARYVIEW BOOL,
WHITELISTED BOOL
);
那么你的查詢就更容易開發也更容易閱讀:
SELECT COLUMNNAME FROM column_metadata WHERE WHITELISTED = true;
您還可以通過在普通表中定義索引來優化查詢,而在 JSON arrays 上創建索引會令人困惑,並且需要在 MySQL 8.0.17 中引入更多新功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.