我有一个Post模型,其列由以下迁移定义:
add_column :posts, :comments, :jsonb, default: []
add_index :posts, :comments, using: :gin
Run Code Online (Sandbox Code Playgroud)
我想知道要运行的查询,以便我计算所有Posts默认空数组为comments.
我有一个标签存储为 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 中的逗号后放置一个空格。
请帮助我理解,如何从一个表中复制值并将其插入到另一个 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 表,它将 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 表 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 中我没有找到类似的函数
我有一个相对较小的表(~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) 我正在尝试从包含 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) 我有一个带有 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
谢谢!
假设有以下相当简单的数据库:
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) 我有一个带有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)