簡體   English   中英

從按另一個屬性值過濾的 json 數組中檢索屬性值

[英]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.

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