我在postgres数据库上工作,我将使用混合的关系表和jsonb表(可以索引).
我正在使用大量的CTE查询来插入或更新从临时表中选择的数据,例如:
WITH information as (
select fieldA, fieldB, fieldC from tableA
)
insert (fieldA, fieldB, fieldC)
SELECT inf.fieldA, inf.fieldB, inf.fieldC
from information inf
Run Code Online (Sandbox Code Playgroud)
好吧,我想知道是否有可能在这种表中创建临时索引,如果是,是否可以在jsonb类型fieds中创建索引?(考虑这个临时表)
我使用这个在PostgreSQL中创建了一个表:
CREATE TEMP TABLE jsontesting
AS
SELECT id, jsondata::jsonb FROM ( VALUES
(1, '["abra","value","mango", "apple", "sample"]'),
(2, '["japan","china","india", "russia", "australia"]'),
(3, '["must", "match"]'),
(4, '["abra","value","true", "apple", "sample"]'),
(5, '["abra","false","mango", "apple", "sample"]'),
(6, '["string","value","mango", "apple", "sample"]'),
(7, '["must", "watch"]')
) AS t(id,jsondata);
Run Code Online (Sandbox Code Playgroud)
现在我想要的是
添加像append_to_json_array这样的东西,实际的jsondata是一个json数组,而newString是我必须添加到jsondata数组的,这个函数应该返回更新的json数组.
UPDATE jsontesting
SET jsondata=append_to_json_array(jsondata, 'newString')
WHERE id = 7;
Run Code Online (Sandbox Code Playgroud)从json数据数组中删除一个值,一个用于删除值的函数.
我试图搜索postgreSQL的文档,但没有发现任何内容.
我正在寻求从Postgres 9.3迁移到9.4,并在JSON列中拥有大量数据.虽然很好,但我想看看迁移到更有效的列存储(JSONB似乎是一个非常令人兴奋的技术!).
要实际迁移,我想了解类似的迁移特征
ALTER TABLE table_with_json
ALTER COLUMN my_json
SET DATA TYPE jsonb
USING my_json::jsonb;
Run Code Online (Sandbox Code Playgroud)
(从这个有用的问题).
理想情况下,了解迁移1mil和10mil条目需要多长时间以及它如何扩展将是一件好事.
虽然我可以自己获得这些数字,但我认为这个问题可能对其他人有帮助.如果我最终自己尝试这个,我肯定会为其他人提供答案,但不确定何时会发生.
假设我有一张桌子product:
create table product
(
attributes jsonb
);
Run Code Online (Sandbox Code Playgroud)
有数据:
insert into product (attributes)
values ('{"Color": "Red"}'),
('{"color": "White"}'),
('{"COLOR": "Blue"}');
Run Code Online (Sandbox Code Playgroud)
如何color在PostgreSQL 9.4+中选择所有记录的属性?由于键的外壳不同,我无法使用此语法:
select
attributes->>'color' as color
from product;
Run Code Online (Sandbox Code Playgroud)
我的预期输出是:
Red
White
Blue
Run Code Online (Sandbox Code Playgroud)
我也试过使用这种语法(工作但感觉很难):
select
coalesce(
attributes->>'color',
attributes->>'Color',
attributes->>'COLOR') as color
from product;
Run Code Online (Sandbox Code Playgroud)
这可能吗?我可以看到,如果你拥有color并Color锁定同一个对象可能会发生冲突,所以如果这不是一件事我也不会感到惊讶.
参考文献:
我确实弄清楚如何从一个数组中删除单个记录的值,但是如何为其中许多记录删除它.问题在于我如何使用子查询.因为它必须只返回单个元素.也许我的方法是错的.
Given input: '{attributes:['is_new', 'is_old']}'
Expected result '{attributes: ['is_old']}' #remove 'is_new' from jsonb array
Real example:
# sku | properties
# -------+--------------------------------
# nu3_1 | { +
# | "name": "silly_hodgkin", +
# | "type": "food", +
# | "attributes": [ +
# | "is_gluten_free", +
# | "is_lactose_free", +
# | "is_new" +
# | ] +
# | }
#Query that removes single array element: SELECT c.sku, jsonb_agg(el) FROM catalog c JOIN (select sku, jsonb_array_elements_text(properties->'attributes') as el …
简短版本是:如何jsonb使用Spring Data Rest PATCH方法修补Postgres 字段中包含的JSON对象?
这是长版本,请考虑以下实体:
@Entity
@Table(name = "examples")
public class Example {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String jsonobject;
@JsonRawValue
public String getJsonobject() {
return jsonobject == null ? null : jsonobject;
}
public void setJsonobject(JsonNode jsonobject) {
this.jsonobject = jsonobject == null ? null : jsonobject.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
jsonobject是Postgres类型jsonb.这些getter/setter是为这里提到的Spring Data Rest序列化/反序列化它的方法.我们还尝试给该字段提供自己的类型,如这些答案中所述.
我们的目标是使用Spring Data Rest修补此字段包含的JSON对象.
例如:
GET /examples/1
{
"id": 1,
"jsonobject": {
"foo": {"bar": …Run Code Online (Sandbox Code Playgroud) 使用||运算符会产生以下结果:
select '{"a":{"b":2}}'::jsonb || '{"a":{"c":3}}'::jsonb ;
?column?
-----------------
{"a": {"c": 3}}
(1 row)
Run Code Online (Sandbox Code Playgroud)
我希望能够实现以下结果(??只是运营商的占位符):
select '{"a":{"b":2}}'::jsonb ?? '{"a":{"c":3}}'::jsonb ;
?column?
-----------------
{"a": {"b": 2, "c": 3}}
(1 row)
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到顶级a键的子值已"合并",因此结果包含b和c.
你如何"深入"合并Postgres中的两个JSONB值?
这有可能,如果是这样的话怎么样?
一个更复杂的测试用例:
select '{"a":{"b":{"c":3},"z":true}}'::jsonb ?? '{"a":{"b":{"d":4},"z":false}}'::jsonb ;
?column?
-----------------
{"a": {"b": {"c": 3, "d": 4}, "z": false}}
(1 row)
Run Code Online (Sandbox Code Playgroud)
另一个测试用例,其中一个原语"合并"和对象:
select '{"a":{"b":{"c":3},"z":true}}'::jsonb ?? '{"a":{"b":false,"z":false}}'::jsonb ;
?column?
-----------------
{"a": {"b": false, "z": false}}
(1 row)
Run Code Online (Sandbox Code Playgroud) 我正在使用Postgres 9.6,我有一个JSONB列,其中有些行有NULL值,有些行有dict值,如{"notify": false}.
我想用更多的字典键/值对更新列值.
UPDATE accounts SET notifications = jsonb_set(notifications, '{"alerts"}', 'false');
Run Code Online (Sandbox Code Playgroud)
适用于我已经拥有类似值的情况{"notify": false}.最终结果如预期的那样{"alerts": false, "notifications": false}.
但是我试图更新我们的价值NULL,数据库中没有任何更新.
你能告诉我如何更新这些NULL值,所以它们的最终结果将是像这样的值{"notify": false}.最终结果如预期的那样{"alerts": false}
许多jsonb / json函数期望列的所有值要么是json数组类型(如jsonb_array_length),要么仅是json对象类型(如jsonb_build_oject)。
数据库中有一些jsonb列,其中包含数组和对象根的混合,是否有任何简单的方法可以过滤掉数组和对象,以便查询
SELECT DISTINCT jsonb_object_keys(my_column) FROM my_table;
cannot call jsonb_object_keys on an array
Run Code Online (Sandbox Code Playgroud)
要么
SELECT my_column FROM my_table WHERE jsonb_array_length(column) > 0;
cannot get array length of a non-array
Run Code Online (Sandbox Code Playgroud)