当不是正在搜索的每一行都包含 JSON 时,如何使用 SQL 查询在 JSON 字符串中搜索?
Posted
技术标签:
【中文标题】当不是正在搜索的每一行都包含 JSON 时,如何使用 SQL 查询在 JSON 字符串中搜索?【英文标题】:How to search inside a JSON string with a SQL query when not every row that is being searched in contains JSON? 【发布时间】:2021-08-22 09:48:28 【问题描述】:我有一个表,其中包含一个列 (rated_by
),其中包含一些 json 格式的 id。示例:["59"]
我想在整个表的所有rated_by
列中搜索特定数字。
我之前已经在同一个表中为另一列执行此操作,该列也包含与上面相同格式的 id,并使用以下查询(对于列 producten)
:
SELECT * FROM review WHERE JSON_SEARCH(producten,"one", "26") IS NOT NULL ORDER BY useful DESC
这很好用,这是因为producten
的每一行都填充了 json,没有一个是空的,但是对于rated_by
,有些行可以是空的。
使用完全相同的查询,如下所示:
SELECT * FROM review WHERE JSON_SEARCH(rated_by,"one", "59") IS NOT NULL
我得到:Invalid JSON text in argument 1 to function json_search: "The document is empty." at position 0.
我通过清空producten
的一行并再次尝试工作查询来测试它,它停止工作。
所以问题是当rated_by
的一行不包含json 或为空时,我的查询停止工作。
这是为什么呢?我认为使用 IS NOT NULL
可以解决这个问题。
我正在使用 mysql。
【问题讨论】:
@Akina 我的错,我从我的代码中复制粘贴错误。我现在在我的帖子中输入了正确的查询。 该问题是由JSON_SEARCH
需要文档引起的,或者当参数不是有效文档时会发出错误。在调用JSON_SEARCH
之前,请确保该值是实际文档。 WHERE JSON_VALID(rated_by) AND JSON_SEARCH(rated_by,"one", "59") IS NOT NULL
.
【参考方案1】:
我使用JSON_VALID
修复了它(首先检查该行是否包含有效的 json,只有如果包含,才检索数据)如上所述。
工作查询:
SELECT * FROM review WHERE JSON_VALID(rated_by) AND review_id = "10" AND JSON_SEARCH(rated_by,"one", "59") IS NOT NULL
【讨论】:
以上是关于当不是正在搜索的每一行都包含 JSON 时,如何使用 SQL 查询在 JSON 字符串中搜索?的主要内容,如果未能解决你的问题,请参考以下文章
无法将 JSON 转换为 pandas。所有数据都包含在一行中。我该如何解压它?