【发布时间】:2016-12-05 08:57:57
【问题描述】:
我使用 PostgreSQL 9.5 和 Rails 5。我想查询下面显示的包含 JSON 对象数组的 jsonb 列,以返回所有包含 {"kind":"person"} 的 JSON 数组元素并执行计数。
我使用的 SQL 显示在 json 数据下方。运行查询只会返回一个空数组。
这就是我的jsonb 数据的样子:
'[
{"kind":"person", "filter_term":"56","selected_attr":"customer"},
{"kind":"email", "filter_term":"marketer","selected_attr":"job_title"}
]'
我希望返回其中一个 sql 查询:
data
----------------------------------------------------------------------
'{"kind":"person", "filter_term":"56","selected_attr":"customer"}'
(1 row)
和另一个返回数组的查询,以便我可以在我的应用程序中调用 count 并循环它以创建表单:
data
----------------------------------------------------------------------
'[{"kind":"person", "filter_term":"56","selected_attr":"customer"}]'
(1 row)
我试过这个 SQL 查询:
"SELECT * FROM \"segments\" WHERE (payload @> '[{\"kind\":\"person\"}]')"
我也试过这个查询:
"SELECT payload FROM segments WHERE payload @> '[{\"kind\":\"person\"}]'::jsonb;"
这是第三个查询:
"SELECT * FROM segments s WHERE s.payload->'\"#{a}\"' @> '[{\"kind\":\"person\"}]';"
型号:
class Segment < ApplicationRecord
store_accessor :payload,:kind, :filter_term, :selected_model_name, :selected_attr, :limit, :selected_operator
end
迁移:
create_table "segments", force: :cascade do |t|
t.jsonb "payload", default: "[]", null: false
t.index ["payload"], name: "index_segments_on_payload", using: :gin
end
【问题讨论】:
-
=>是hstore的有效语法,但不适用于json(或jsonb)。有效的 json 文字:'{"kind":"person"}'请修正您的示例并添加您的预期结果。 "all the json" 有点模糊。还有表格行,还有数据类型json,但是什么是"json row"呢?你的意思是 JSON 数组元素? -
非常感谢您的帮助。是的,我的意思是 JSON 数组元素。我已经改写了这个问题,希望它更清楚。
标签: sql ruby-on-rails postgresql rails-activerecord jsonb