标签: json

我可以用新的 json 字段做什么?

PostgreSQL 9.2 引入了json字段类型。为什么以及何时应该使用它?它比文本字段有什么好处?

我以为有新的查询选项可用,但我没有看到任何选项。我错过了什么吗?

postgresql postgresql-9.2 postgresql-9.3 json

8
推荐指数
1
解决办法
6251
查看次数

如何在 postgres 中的整数 json 属性上创建索引

我一生都无法弄清楚如何在我的 json 列的整数属性上创建索引。

我以这种方式尝试过(以及其他数十种方式)

CREATE INDEX user_reputation_idx ON users(("user"->>'reputation')::int)
Run Code Online (Sandbox Code Playgroud)

它在查询中工作得很好(例如ORDER BY ("user"->>'reputation')::int

我错过了什么?

更新

我收到一个简单的语法错误,但是,我真的不知道为什么。

ERROR:  syntax error at or near "::"
LINE 1: ... user_reputation_idx ON users (("user"->>'reputation')::int)
Run Code Online (Sandbox Code Playgroud)

表定义非常简单。它只是一列usertype json

所以,看起来像这样:

CREATE TABLE users
(
  "user" json
)
Run Code Online (Sandbox Code Playgroud)

postgresql index cast postgresql-9.3 json

8
推荐指数
1
解决办法
7484
查看次数

如何从 PostgreSQL 中的 JSON[] 数组中删除已知元素?

我遇到了在 PostgreSQL 中使用 JSON 数据类型的问题。我尝试实现在数据库中存储非规范化的 Java 模型。该模型具有复杂对象列表。因此,我决定将它们建模为原生 PostgreSQL 数组中的 JSON。

这是我的表创建语句的精简片段:

CREATE TABLE test.persons
(
  id UUID,
  firstName TEXT,
  lastName TEXT,
  communicationData JSON[],
  CONSTRAINT pk_person PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

如您所见,它是一个以 JSON 格式显示通信数据对象列表的人。其中一个对象可能如下所示:

{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}
Run Code Online (Sandbox Code Playgroud)

我可以使用 PostgreSQL 的 array_append 轻松地将这样的 JSON 对象附加到数组中。但是,我无法从数组中删除已知值。考虑一下这个 SQL 语句:

UPDATE test.persons
SET communicationData = array_remove(
      communicationData, 
      '{"value" : "03334/254147", "typeId" : "ea4e7d7e-7b87-4628-ba50-6a5f6e63dbf6"}'::JSON
    )
WHERE id = 'f671eb6a-d603-11e3-bf6f-07ba007d953d';
Run Code Online (Sandbox Code Playgroud)

这失败了ERROR: could not identify an equality operator for type json。您是否有提示我如何从 JSON 数组中删除已知值?也可以按数组中的位置删除,因为我知道一个也......

PostgreSQL …

postgresql update array json

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

将对象聚合到 json 数组中(子查询问题)

我很抱歉这个模糊的标题,但我根本不知道用什么合适的词来描述这个。

我有这个查询将一堆列转换为一个可以正常工作的对象:

SELECT row_to_json(t)
FROM (
  SELECT type, properties, geometry FROM "bgbCargoMinardJSON"
) t
Run Code Online (Sandbox Code Playgroud)

但是,我想将属于某个类别的对象分组到一个数组中。该类别由我的表中名为“cargoProductId”的第四列定义。该数组应将“cargoProductId”的值作为键。所以:

SELECT row_to_json(t)
FROM (
  SELECT type, properties, geometry FROM "bgbCargoMinardJSON"
) t
Run Code Online (Sandbox Code Playgroud)

所以我在过去的 1 1/2 小时左右一直在努力解决这个问题。我真的不知道如何做到这一点。这就是我现在所拥有的:

SELECT array_agg(row_to_json(t))
FROM (
  SELECT type, properties, geometry FROM "bgbCargoMinardJSON"
) t) FROM "bgbCargoMinardJSON" GROUP BY "carProductId"
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate json

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

Postgres 查询以将 JSON 对象键作为数组返回

是否可以将 JSON 对象键作为 PostgreSQL 中的值数组返回?

在 JavaScript 中,这只是Object.keys(obj),它返回一个字符串数组。

例如,如果我有一张这样的表:

tbl_items
---------
id bigserial NOT NULL
obj json NOT NULL
Run Code Online (Sandbox Code Playgroud)

如果有这样的一行:

id      obj
-----   -------------------------
123     '{"foo":1,"bar":2}'
Run Code Online (Sandbox Code Playgroud)

我怎样才能有一个查询返回:

id      keys
-----   ------------------
123     '{"foo","bar"}'
Run Code Online (Sandbox Code Playgroud)

postgresql array json postgresql-9.4

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

jsonb 键的长名称是否使用更多存储空间?

考虑以下示例:两个表foobar,每个表都有一个 jsonb 列。

  • 对于foo,有一百万行 jsonb 的值是[{"a":123}]

  • 对于bar,有一百万行,其中 jsonb 的值是[{"very_long_key_not_premature_optimization_at_all":123}]

json key inbar比 in 长 46 个字符foo。的大小bar会比 4600 万字节大foo吗?

postgresql json

8
推荐指数
1
解决办法
1638
查看次数

更新嵌套在 JSON 对象数组中给定键的所有值

我在 Postgres 表中有一个jsonb列。它包含以下数据:datamy_table

[
   {"id":"1","status":"test status1","updatedAt":"1571145003"},
   {"id":"2","status":"test status2","updatedAt":"1571145323"}
]
Run Code Online (Sandbox Code Playgroud)

我想updatedAt使用一个查询更新该数组中所有对象的键。我试过:

update my_table set data = data || '{"updatedAt": "1571150000"}';
Run Code Online (Sandbox Code Playgroud)

上面的查询在数组中添加了一个新对象,如下所示:

[
   {"id":"1","status":"test status1","updatedAt":"1571145003"},
   {"id":"2","status":"test status2","updatedAt":"1571145323"},
   {"updatedAt":"1571150000"}
]
Run Code Online (Sandbox Code Playgroud)

我想要的输出如下:

[
   {"id":"1","status":"test status1","updatedAt":"1571150000"},
   {"id":"2","status":"test status2","updatedAt":"1571150000"}
]
Run Code Online (Sandbox Code Playgroud)

我也尝试过jsonb_set(),但这需要第二个参数是数组索引。我无法确定数组中 JSON 对象的数量。

如果可以通过自定义函数解决这个问题,也很好。

postgresql update json postgresql-10 json-path

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

jsonb_array_elements() 失败并显示“错误:无法从对象中提取元素”

使用:Postgres 14.2。
目标:获取表中所有不同国家/地区的列表。

该列address是一种JSONB列类型,包含一个结构如下的数组:

{
   "address":[
      {
         "types":["route"],
         "long_name":"20203 113B Ave",
         "short_name":"20203 113B Ave"
      },
      {
         "types":["locality","political"],
         "long_name":"Maple Ridge",
         "short_name":"Maple Ridge"
      },
      {
         "types":["administrative_area_level_3","political"],
         "long_name":"Maple Ridge",
         "short_name":"Maple Ridge"
      },
      {
         "types":["administrative_area_level_2","political"],
         "long_name":"Greater Vancouver",
         "short_name":"Greater Vancouver"
      },
      {
         "types":["administrative_area_level_1","political"],
         "long_name":"British Columbia",
         "short_name":"BC"
      },
      {
         "types":["country","political"],
         "long_name":"Canada",
         "short_name":"CA"
      },
      {
         "types":["postal_code"],
         "long_name":"V2X 0Z1",
         "short_name":"V2X 0Z1"
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

如何过滤这个对象数组,使其仅返回数组索引(如果包含)的值"long_name"(例如) ?Canadatypes"country"

我正在尝试类似的事情,但显然,我只想返回国家/地区,而不是整个品牌。

SELECT * from brand
where address::text ilike ANY (ARRAY['%country%'::text]);
Run Code Online (Sandbox Code Playgroud)

此查询失败并显示:

{
   "address":[ …
Run Code Online (Sandbox Code Playgroud)

postgresql json json-path jsonb

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

多行到json

看起来我的问题很不寻常,因为我根本没有找到答案。让我们想象一下,我有一个A带有列的表:languageuri

语言 | uri             
----------|-----------------
茹 | 一些uri        
zh | 另一个uri
...

我的问题是:如何返回 JSON 对象而不是多行。例如:

{ "ru": "some-uri", "en": "some-another-uri", ... }

postgresql select json

7
推荐指数
2
解决办法
8951
查看次数

在postgresql函数中循环jsonb对象的键/值对

我正在尝试在 Postgres 中创建一个函数,该函数可以遍历给定jsonb对象中的每个键/值对。

create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN

    // foreach(key in input)
    //       do some math operation on its corresponding value

    returns input;

END; $$
Run Code Online (Sandbox Code Playgroud)

参数输入应为 jsonb 对象,例如{"a":1, "b":2, "c":3}.

我想遍历对象中的每个键/值对。从我的评论中可以看出,我曾经使用更通用的编程语言(如 c、java 等)编写后端代码。所以我不擅长 SQL。我曾尝试在线搜索,但他们谈论如何遍历jsonb数组而不是对象。所以真的卡在这里了。

postgresql plpgsql json

7
推荐指数
1
解决办法
1万
查看次数