标签: jsonb

如何在 Postgres、Activerecord、Rails 5 中查询空的 jsonb 数组

我有一个Post模型,其列由以下迁移定义:

add_column :posts, :comments, :jsonb, default: []

add_index :posts, :comments, using: :gin
Run Code Online (Sandbox Code Playgroud)

我想知道要运行的查询,以便我计算所有Posts默认空数组为comments.

postgresql activerecord jsonb ruby-on-rails-5

2
推荐指数
1
解决办法
976
查看次数

Postgresql:如何对 json 数组执行 LIKE 查询?

我有一个标签存储为 JSONB 列的表。喜欢:

id   tags
---- ------------------------------
1    ["red", "blue"]
2    ["orange", "light pink"]
3    ["pink", "green"]
Run Code Online (Sandbox Code Playgroud)

我想选择包含与模式部分匹配的标签的行——在我的情况下,我想要其中带有空格的标签。类似的东西SELECT * FROM the_table WHERE tags LIKE '% %'。将数组转换为文本几乎可以工作,除了所有匹配项,因为 Postgres 在输出 JSON 中的逗号后放置一个空格。

postgresql json jsonb

2
推荐指数
1
解决办法
3527
查看次数

从一个表中复制值并将其插入另一个 jsonb 字段

请帮助我理解,如何从一个表中复制值并将其插入到另一个 jsonb 字段中?

additional_info 是产品表中的 jsonb 字段。

dedication, stories, status我想在additional_info字段中复制书籍表中的这个字段。

我这样试过,但显然这是不正确的

INSERT INTO products (order_id, name, price, type, additional_info)

SELECT order_id, name, null, 'Book', '{\"dedication\": dedication, \"stories\": stories, \"status\": status }'

FROM books;
Run Code Online (Sandbox Code Playgroud)

postgresql jsonb

2
推荐指数
1
解决办法
1059
查看次数

基于通配符键查询嵌套的json

我有一个 PostgresQL 表,它将 JSON 存储为 jsonb:

 Column |  Type   |                         Modifiers                         | Storage  | Stats target | Description 
--------+---------+-----------------------------------------------------------+----------+--------------+-------------
 id     | integer | not null default nextval('history_id_seq'::regclass)      | plain    |              | 
 data   | jsonb   | not null                                                  | extended |              | 
Run Code Online (Sandbox Code Playgroud)

JSON 的结构:

{
    "20180201": {
        "foo": [{
            "name": "item1",
            "desc": "an item 1"
        }, {
            "name": "item2",
            "desc": "an item 2"
        }],
        "bar": [{
            "name": "item1",
            "desc": "an item 1"
        }, {
            "name": "item2",
            "desc": "an item 2"
        }] …
Run Code Online (Sandbox Code Playgroud)

postgresql jsonb

2
推荐指数
1
解决办法
2219
查看次数

提取 postgresql jsonb 对象的所有值

我有一个 postgresql 表 t1,id 整数,数据 jsonb

   id    |   data
--------------------
    1    | {"1":{"11":11},"2":{"12":12}}
Run Code Online (Sandbox Code Playgroud)

我需要一个函数来提取这样的单独行中的所有键/值

   key   |   values
----------------------
    1    |  {"11":11}
    2    |  {"12":12}
Run Code Online (Sandbox Code Playgroud)

在“hstore”数据类型中,有“hvals”函数,这样做
但在 jsonb 中我没有找到类似的函数

postgresql jsonb

2
推荐指数
1
解决办法
3680
查看次数

从 JSONB 字段中选择缓慢

我有一个相对较小的表(~50k 行)。当我选择所有记录时,需要大约 40 秒。该表有 3 个 JSONB 列。当我选择除 JSONB 之外的每一列时,查询需要大约 700 毫秒。

如果我只添加 JSONB 字段之一,查询时间会跳到近 10 秒。

我从不使用引用 JSONB 内部内容的 where 子句,只是选择 *. 即便如此,我还是尝试添加 GIN 索引,因为我看到它们经常被提及作为 JSONB 的性能提升器。

我已经完全真空了。

Postgres 9.6 版

 explain (analyze, buffers) select * from message;
   Seq Scan on message  (cost=0.00..5541.69 rows=52969 width=834) (actual 
   time=1.736..116.183 rows=52969 loops=1)
     Buffers: shared hit=64 read=4948
   Planning time: 0.151 ms
   Execution time: 133.555 ms
Run Code Online (Sandbox Code Playgroud)

postgresql jsonb

2
推荐指数
1
解决办法
1798
查看次数

运算符不存在 - Postgres 和 JSON 选择查询

我正在尝试从包含 JSONB 数据的表中检索和连接数据,其中 JSON 行的格式为:

{
    "id": "d57929b35216",
    "base" : {"legalName" : "SAPI S.P.A."}, 
    "name": "SAPI S.P.A.", 
}
Run Code Online (Sandbox Code Playgroud)

表ita_public

CREATE TABLE public.ita_public
(
    id integer NOT NULL DEFAULT nextval('ita_data_id_seq'::regclass),
    info jsonb NOT NULL,
    CONSTRAINT ita_data_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

表 ita_sn_private

CREATE TABLE public.ita_sn_private
(
    id integer NOT NULL DEFAULT nextval('ita_sn_private_id_seq'::regclass),
    supplier_name character varying COLLATE pg_catalog."default",
    supplier_streetadd character varying COLLATE pg_catalog."default",
    CONSTRAINT ita_sn_private_pkey PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

SELECT 查询打印三列,连接供应商名称和嵌套名称并搜索名称:

SELECT
priv.supplier_name,
priv.supplier_streetadd,
pub.info::json->'base'->'legalName'

FROM ita_sn_private as priv 
JOIN ita_public as …
Run Code Online (Sandbox Code Playgroud)

postgresql json jsonb

2
推荐指数
1
解决办法
3173
查看次数

活动记录 postgres 检查 jsonb 数组是否包含 x 或 y

我有一个带有 jsonb 列的表,该列有一个嵌套的 json 数组。我想找到嵌套数组至少包含一个值的所有记录。

例如,我的模型 Person 有一个名为首选项的 jsonb 列。在 jsonb 首选项中,有几个键,其中一个值是一个数组:

Person.first.preferences = {"diet" => {"foods" => ["apples", "oranges", "bananas"]}}
Run Code Online (Sandbox Code Playgroud)

我想创建一个查询,返回其偏好 -> 饮食 -> 食物包括“苹果”或“芒果”的所有人员(例如)。

目前,我可以通过 1 个输入(即“苹果”)获得结果,如下所示:

Person.where('preferences @> ?', {'diet' => {'foods' => ['apples']}}.to_json)
Run Code Online (Sandbox Code Playgroud)

以及多个输入,如果它们都存在于数组中。因此,如果我传入 'apples' 和 'oranges',则会返回结果,因为该记录同时包含苹果和橙子。

Person.where('preferences @> ?', {'diet' => {'foods' => ['apples', 'oranges']}}.to_json)
Run Code Online (Sandbox Code Playgroud)

有没有办法传入多个变量(即 ['apples', 'mangos'])并检查嵌套的 jsonb 数组是否包含 apples 或 mangos 但​​不一定两者都包含?

以下查询没有结果,因为我的人的食物偏好不包括芒果,即使它们包括苹果。

Person.where('preferences @> ?', {'diet' => {'foods' => ['apples', 'mangos']}}.to_json)
Run Code Online (Sandbox Code Playgroud)

使用 Rails 5.2 和 Postgresql 10

谢谢!

postgresql activerecord ruby-on-rails jsonb

2
推荐指数
1
解决办法
1359
查看次数

交叉连接可以是“隐式横向”吗?

假设有以下相当简单的数据库:

CREATE TABLE test_table(
  name TEXT,
  data JSONB
);
INSERT INTO test_table VALUES ('name1', '{"a": 1, "b": 2}'), ('name2', '{"c": 3, "d": 4, "e": 5}');
Run Code Online (Sandbox Code Playgroud)

所以我们有下表:

# SELECT * FROM test_table ;
 name  |           data
-------+--------------------------
 name1 | {"a": 1, "b": 2}
 name2 | {"c": 3, "d": 4, "e": 5}
(2 rows)
Run Code Online (Sandbox Code Playgroud)

现在我看到了这样的查询:

# SELECT * FROM test_table CROSS JOIN JSONB_EACH(test_table.data);
Run Code Online (Sandbox Code Playgroud)

返回以下结果:

 name  |           data           | key | value
-------+--------------------------+-----+-------
 name1 | {"a": 1, "b": 2}         | a   | 1 …
Run Code Online (Sandbox Code Playgroud)

postgresql jsonb lateral-join

2
推荐指数
1
解决办法
223
查看次数

当列为空时,为什么 jsonb-functions 在更新时不起作用?

我有一个带有jsonb列的表,其中列的默认值为null. 现在,当我第一次尝试使用数据更新此列时,jsonb_set或者jsonb_insert我得到UPDATE 1了结果,但实际上,该列保持null.

我做了一个小测试用例:

CREATE SCHEMA test;
CREATE TABLE test.books (  
  book_id serial NOT NULL,
  data jsonb
);

INSERT INTO test.books (data) VALUES (null);
INSERT INTO test.books (data) VALUES ('{}');
Run Code Online (Sandbox Code Playgroud)

现在我更新两个新记录:

UPDATE test.books SET data = jsonb_set( data, '{zzz}', 'true', true) WHERE book_id = 1;
UPDATE test.books SET data = jsonb_set( data, '{zzz}', 'true', true) WHERE book_id = 2;
Run Code Online (Sandbox Code Playgroud)

结果:

# select * from test.books;
 book_id |                data …
Run Code Online (Sandbox Code Playgroud)

postgresql jsonb

2
推荐指数
1
解决办法
77
查看次数