标签: jsonb

无法从标量中提取元素

我有 2 表公司和联系人。联系人具有地址 JSONB 列。我在contacts.linked_to_company 上尝试了一个带有join 的select 语句并使用jsonb_array_elements(company.addresses) 但我收到错误“无法从标量中提取元素”,我理解这是因为某些条目在列地址中确实有[null]。我已经看到了使用合并或 CASE 语句的答案。Coalesce 我可能无法工作,CASE 示例在 select 语句中,如何在连接中使用它?这是sql

SELECT company.id,
trading_name, 
nature_of_business, 
t.id contactID, 
address->>'PostCode' Postcode,
position_in_company
FROM contact t FULL JOIN company ON (t.company_linked_to = company.id ),
jsonb_array_elements(t.addresses) address
  WHERE
 t.company_linked_to ='407381';
Run Code Online (Sandbox Code Playgroud)

这是示例 jsonb

[{"PostCode":"BN7788","Address":"South Street","AddressFull":"","Types":[{"Type":"Collection"}]}]
Run Code Online (Sandbox Code Playgroud)

sql postgresql json jsonb

5
推荐指数
1
解决办法
8473
查看次数

sequelize postgres 将 fn 'date' 与 jsonb 值结合起来

我需要MM/DD/YYYY使用sequelize 将jsonb 列上的一个格式字符串与postgres 中的另一个格式字符串进行比较。

在常规专栏上我会做类似的事情

sequelize.where(sequelize.fn('date', sequelize.col('created_at'), '>=', moment().subtract(1, 'days').format('MM/DD/YYY'))),
Run Code Online (Sandbox Code Playgroud)

但是一旦该值位于 JSONB 中,我似乎找不到引用它的方法。

我尝试了多种变体:

sequelize.col("data ->> 'created_at'")

sequeliez.json("data.created_at")
Run Code Online (Sandbox Code Playgroud)

ETC...

实施这个的正确方法是什么?

postgresql sequelize.js jsonb

5
推荐指数
1
解决办法
785
查看次数

如何提取 JSONB 数组的元素?

运行 PostgresSQL v10.5。

在我的表中有一个类型为 的table_a列。metadatajsonb

它有一个 JSON 数组作为其键之一,array_key其值如下所示:

[{"key1":"value11", "key2":"value21", "key3":"value31"}, 
 {"key1":"value21", "key2":"value22", "key3":"value23"}]
Run Code Online (Sandbox Code Playgroud)

这就是我查询这个密钥的方式

SELECT metadata->>'array_key' from table_a
Run Code Online (Sandbox Code Playgroud)

这给了我整个数组。有什么方法可以只查询选定的键并可能格式化它们?

数组的类型是文本,pg_typeof(metadata->>'array_key')text

理想的输出是

"value11, value13", "value21, value23"
Run Code Online (Sandbox Code Playgroud)

arrays postgresql aggregate-functions jsonb postgresql-10

5
推荐指数
1
解决办法
5810
查看次数

在 Postgres 中索引 jsonb 数组

我尝试设置 GIN 索引,但我认为在运行请求时没有使用我的索引,无论是使用运算符还是函数。

环境

在我们的表中,我们有一个json_aip包含 Json的 JSONB 字段 ( ),如下所示:

{
    "properties": {
        "pdi": {
            "contextInformation": {
                "tags": ["SOME_TAG"]
            },
    },
}
Run Code Online (Sandbox Code Playgroud)

表创建:

create table t_aip (
    json_aip jsonb,
    [...]
);

CREATE INDEX idx_aip_tags 
ON t_aip 
USING gin ((json_aip -> 'properties' -> 'pdi' -> 'contextInformation' -> 'tags'));
Run Code Online (Sandbox Code Playgroud)

运营商查询

我们不能?|像使用 JDBC 一样使用运算符。但是有传言说当我运行这种类型的查询时我应该看到我的索引。

EXPLAIN ANALYZE SELECT count(*)  
FROM storage.t_aip 
WHERE json_aip#>'{properties,pdi,contextInformation,tags}' ?| array['SOME_TAG']
Run Code Online (Sandbox Code Playgroud)

结果:

  Aggregate

  (cost=27052.16..27052.17 rows=1 width=8) (actual time=488.085..488.087 rows=1 loops=1)
  ->  Seq Scan on t_aip  (cost=0.00..27052.06 …
Run Code Online (Sandbox Code Playgroud)

postgresql indexing jsonb

5
推荐指数
1
解决办法
2258
查看次数

Use a Postgres trigger to record the JSON of only the modified fields

Is there a way to get the JSON of the only modified fields?

Now I use the following trigger but the entire line is printed in the changelog.

Example tables:

TABLE tbl_changelog (
  tbl    TEXT,
  op   TEXT,
  new     JSON,
  old     JSON
);

TABLE tbl_items (
  f1    TEXT,
  f2    TEXT
);
Run Code Online (Sandbox Code Playgroud)

Trigger:

CREATE OR REPLACE FUNCTION changelog_procedure() RETURNS trigger AS $$
BEGIN
INSERT INTO tbl_changelog(tbl, op, new, old)
VALUES (TG_TABLE_NAME, TG_OP, row_to_json(NEW), row_to_json(OLD));
RETURN NULL;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER; …
Run Code Online (Sandbox Code Playgroud)

postgresql json plpgsql database-trigger jsonb

5
推荐指数
1
解决办法
2073
查看次数

JSONB 数组上的 Sequelize 查询

这是模型和postgres数据库中的 JSONB 数组数据类型:

.
.
.
      MyField: {
        type: DataTypes.ARRAY(DataTypes.JSONB),
        allowNull: false
      }
.
.
.
Run Code Online (Sandbox Code Playgroud)

表字段包含 JSONB 值:

{"{\"LessonId\": \"1\", \"TeacherId\": \"1\"}"}
Run Code Online (Sandbox Code Playgroud)

这是我在sequelize findAll 方法中的where 子句:

      where: {
        MyField: {
          [Op.contains]: [
            {
              TeacherId: '1',
            }
          ]
        }
      }
Run Code Online (Sandbox Code Playgroud)

生成的查询是这样的:

SELECT
    ...
    "MyField",
FROM
    "MyTable" AS "MyTable" 
WHERE
    "MyTable"."MyField" @> ARRAY [ '{"TeacherId":"1"}' ]:: JSONB [];
Run Code Online (Sandbox Code Playgroud)

并且结果集是空的。但当我LessonId也包括在内时,它就会完成我的回答。我发现 postgres 将 jsonb 对象视为字符串文本。根据 JSONB ARRAY 中的特定键进行查询的正确方法是什么?

postgresql sequelize.js jsonb postgresql-11

5
推荐指数
1
解决办法
4588
查看次数

如何在 PostgreSQL 12 上添加基于选择值 (JSONB) 的条件?

我想过滤带有gold徽章的行。我正在使用 PG12,并且使用它的新路径功能。

为了澄清一下,我有一个users_tbl这样的表:

CREATE TABLE users_tbl (
   ID serial NOT NULL PRIMARY KEY,
   data jsonb NOT NULL
); 
Run Code Online (Sandbox Code Playgroud)

让我们插入值:

INSERT INTO users_tbl (ID, data) values (1, '{"badges": ["gold", "silver"], "another_field": 1}');
INSERT INTO users_tbl (ID, data) values (2, '{"badges": ["silver"], "another_field": 3}');
INSERT INTO users_tbl (ID, data) values (3, '{"badges": ["gold"], "another_field": 4}');
Run Code Online (Sandbox Code Playgroud)

现在当我这样查询时:

SELECT
  ID, jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl";
Run Code Online (Sandbox Code Playgroud)

我得到了预期的以下结果:

+----+--------------------+
+ ID |       badges       +
+----+--------------------+
+ 1  | ["gold", "silver"] + …
Run Code Online (Sandbox Code Playgroud)

sql arrays postgresql json jsonb

5
推荐指数
1
解决办法
6390
查看次数

如何在Spring Boot中获取postgres jsonb列的嵌套对象的值

我已经使用 vlad mihalcea 的依赖项将 json 值存储在表中。

表名:valuation_report JsonbColumnparameters属性名在pojo中为params

能够获取单个对象的值,例如address =“Address1”

{"address":"Address1","nestedObj":{"firstName":"Sanjay"}}
Run Code Online (Sandbox Code Playgroud)

为了获取地址,我已经实现了规范和 @Overriden Predicate 方法,例如

@Override
public Predicate toPredicate(Root<ValuationReport> root, CriteriaQuery<?> query, CriteriaBuilder cb)
{
return cb.equal(cb.function("jsonb_extract_path_text", String.class,root.<String>.get("params"),cb.literal(this.locale)), this.fieldToSearch);
}
Run Code Online (Sandbox Code Playgroud)

但现在我想找到 NestedObj 的值,就像nestedObj 的名字是 Sanjay 一样。

{"nestedObj":{"firstName":"Sanjay"}}
Run Code Online (Sandbox Code Playgroud)

请帮助我,我用手机写了所有这些,很抱歉问题格式不正确。

hibernate spring-data-jpa spring-boot jsonb postgresql-9.4

5
推荐指数
1
解决办法
2558
查看次数

postgresql 中 jsonb 键的索引

我正在使用 PostgreSQL。有没有办法只在字典键而不是值上创建索引

例如,想象一个 jsonb 列,如下所示:

select data from tablename where id = 0;

answer: {1:'v1', 2:'v2'}
Run Code Online (Sandbox Code Playgroud)

我想在键集(或键列表)上建立索引,该键集是[1, 2]. 为了加快查询速度,例如:

select count(*) from tablename where data ? '2';
Run Code Online (Sandbox Code Playgroud)

正如您在docs中看到的,有一种方法可以对列进行完全索引(键+值):

CREATE INDEX idxgin ON api USING GIN (jdoc);
Run Code Online (Sandbox Code Playgroud)

考虑到我在值中存储了大量数据,这对我来说不好。

我之前尝试过这个:

CREATE INDEX test ON tablename (jsonb_object_keys(data));
Run Code Online (Sandbox Code Playgroud)

错误是:

ERROR:  set-returning functions are not allowed in index expressions
Run Code Online (Sandbox Code Playgroud)

另外,我不想将键作为值存储在字典中。

你能帮助我吗?

postgresql indexing jsonb

5
推荐指数
1
解决办法
3148
查看次数

如何使用 Spring Data JPA 查询更新 PostgreSQL 中的 JSONB 列

我有以下控制器

@RequestMapping(value = "/update/{tableId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity updateItemQty (@PathVariable Long tableId, @RequestBody AddItemsRequestBody requestBody,
                                              HttpServletRequest request){
        try {
            String addedBy = getUserName(request);
            Float ItemQuantity = requestBody.getItemQuantity();
            LocalDateTime dateTimeAdded = LocalDateTime.now();
            String subId = requestBody.getItemSubId();
            ArrayList<ItemAdditionDetails> updatedAdditionDetails = new ArrayList<>();

        ItemAdditionDetails newItemAdditionDetails = new ItemAdditionDetails();
        newItemAdditionDetails.setIncreamentCount(ItemQuantity);
        newItemAdditionDetails.setAddedDateTime(dateTimeAdded);
        newItemAdditionDetails.setAddedBy(addedBy);

        updatedAdditionDetails.add(newItemAdditionDetails);

// Here i am fetching a JSON-B column that returns an array of json objects from Postgress DB  
     ItemInventoryService.findByItemSubId(subId).getItemsInventoryAdditionDetails().forEach((el) -> {
                updatedAdditionDetails.add(el);
            });

        itemInventoryService.updateItemsAdditionDetails(subId,updatedAdditionDetails); …
Run Code Online (Sandbox Code Playgroud)

java postgresql jpa spring-data-jpa jsonb

5
推荐指数
1
解决办法
6760
查看次数