使用 PostgreSQL,如何找到所有填写了 jsonb 列的记录?
Using PostgreSQL, how do I find all records that have the jsonb column filled out?
假设我有一个名为 "data" 的 jsonb 列类型用于 table "recipes"。我正在尝试查找已填写 "data" 的所有记录(即 "data" 不为空或空括号 {})。
我知道 hstore 列,使用 ruby,你可以使用这样的查询来做到这一点:
Recipe.where("data <> ''")
是否有 jsonb 的等效查询?
正确阅读问题后更新:
您可以像这样检查没有数据的列
SELECT * FROM table WHERE json_column IS NOT NULL
所以这就是
Recipe.where.not('data IS NULL')
对于像这样具有非空散列的列:
SELECT * 来自 table WHERE json_column <> '{}'
这转化为:
Recipe.where('data <> ?', '{}')
# or
Recipe.where("data <> '{}'")
验证您的查询的一个好方法是先在 SQL 中 运行 它们(这样您就可以避免 AR 及其从 Ruby 到 SQL 的翻译)。然后您可以尝试在 AR 中构建查询并使用 to_sql
来查看 AR 对您的查询做了什么。
Recipe.where('data <> ?', '{}').to_sql
#=> "SELECT \"recipies\".* FROM \"recipies\" WHERE (data <> '{}')"
对比
Recipe.where('data <> ?', {}).to_sql
#=> "SELECT \"recipies\".* FROM \"recipies\" WHERE (data <> NULL)"
假设我有一个名为 "data" 的 jsonb 列类型用于 table "recipes"。我正在尝试查找已填写 "data" 的所有记录(即 "data" 不为空或空括号 {})。
我知道 hstore 列,使用 ruby,你可以使用这样的查询来做到这一点:
Recipe.where("data <> ''")
是否有 jsonb 的等效查询?
正确阅读问题后更新:
您可以像这样检查没有数据的列
SELECT * FROM table WHERE json_column IS NOT NULL
所以这就是
Recipe.where.not('data IS NULL')
对于像这样具有非空散列的列:
SELECT * 来自 table WHERE json_column <> '{}'
这转化为:
Recipe.where('data <> ?', '{}')
# or
Recipe.where("data <> '{}'")
验证您的查询的一个好方法是先在 SQL 中 运行 它们(这样您就可以避免 AR 及其从 Ruby 到 SQL 的翻译)。然后您可以尝试在 AR 中构建查询并使用 to_sql
来查看 AR 对您的查询做了什么。
Recipe.where('data <> ?', '{}').to_sql
#=> "SELECT \"recipies\".* FROM \"recipies\" WHERE (data <> '{}')"
对比
Recipe.where('data <> ?', {}).to_sql
#=> "SELECT \"recipies\".* FROM \"recipies\" WHERE (data <> NULL)"