用于确定JSON值是否包含指定属性的SQL查询

Mat*_*lyn 9 mysql attributes json

我有一个表格,用于存储每行的JSON值.目前,这些都没有标准化.我想最终将每个JSON值标准化为数量和属性标题.是否有可用于确定每个JSON值是否包含指定属性的查询?

举个例子,以下是一些JSON值的样子:

{"name":"Item 1","cost":"4.99"}
{"name":"Item 2"}
{"name":"Item 3","cost":""}
{"name":"Item 4"}
Run Code Online (Sandbox Code Playgroud)

我如何能:

  • 确定哪些行具有 "成本"属性(项目1和3)
  • 确定哪些行没有"cost"属性(第2和第4项)
  • 确定哪些行具有为"cost"属性设置的值(第1项)

谢谢!这是我第一次询问(至少最近),所以任何帮助都非常感谢!

Bar*_*mar 16

我假设您正在使用MySQL 5.7,它添加了JSON数据类型.使用JSON_EXTRACT(colname, '$.cost')访问cost属性.这将NULL是没有这样的财产.

  1. WHERE JSON_EXTRACT(colname, '$.cost') IS NOT NULL
  2. WHERE JSON_EXTRACT(colname, '$.cost') IS NULL
  3. WHERE JSON_EXTRACT(colname, '$.cost') != ''

这也将是NULL,如果在JSON值null; 我认为没有办法将其与不存在的价值区分开来.


Pet*_*sko 7

如果您只需要检查 json 键是否存在,可以使用 JSON_CONTAINS_PATH。我希望它比 JSON_EXTRACT 更快。

MySQL 8.0 文档

例子:

我在数据库中有一个权限列。结构如下:

{
    "users": {
        "user1" : "rw",
        "user2" : "r"
    },
    "groups": {
        "root": "rw",
        "anotherGroup" : "r"
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我想获取具有根组的所有项目(关于实际权限),我使用以下命令:

SELECT * FROM `filesystem_folders` where JSON_CONTAINS_PATH(permissions, 'one', '$.groups.root');
Run Code Online (Sandbox Code Playgroud)

我只是在上面的select之间做了一个非常简单的时间比较,它花费了12.90 秒(10000 次读取)。与以下使用JSON_EXTRACT选择

 SELECT * FROM `filesystem_folders` where JSON_EXTRACT(permissions, '$.groups.root') IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

耗时15.13 秒。所以,差别很小。