当不是正在搜索的每一行都包含 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。所有数据都包含在一行中。我该如何解压它?

在大矩阵中搜索值

如何在 Scala/Spark 中为数据框中的每一行编写一个 Json 文件并重命名文件

如何将源文件名添加到 Spark 中的每一行?

如何在clojure中的每一行打印数字列表?

如何使用 *CSS2* 而不是 CSS3 选择 HTML 表格中的每一行? [复制]