查找值嵌套的JSON文档大于INT的行

问题描述 投票:0回答:2

我是PostgreSQL的新手。但是我认为在关系数据库中使用json / jsonb听起来很有趣。

//仅用于信息:我尝试通过C#.NET Core WebAPI和Dapper实现它

例如,我想要一个带有(多维)json列的表:

id | data_____________________________________ | _________________________________________________________________________________|4BF30FE6-D7DD-480B-8592-DC9676576FEF | {timestamps:{“ created”:1578614541,“ modified”:1578615707},“ type”:“ single”}1AC2CD8F-09D0-456C-9FD4-B63E354BD324 | {timestamps:{“ created”:1578614676,“ modified”:1578615921},“ type”:“ multiple”}50AD2D82-5919-4555-BCC2-B24E0DE24263 | {timestamps:{“ created”:1578614552,“ modified”:1578615784},“ type”:“ single”}8C3BE671-17D1-49FD-A891-D5E69FDF7FC2 | {timestamps:{“ created”:1578614685,“ modified”:1578615173},“ type”:“ single”}

而且我想获得所有data :: timestamps.created大于1578614670的ID。

伪代码:

SELECT id, data FROM table WHERE data::timestamps.created > 1578614670;
id | data_____________________________________ | _________________________________________________________________________________|1AC2CD8F-09D0-456C-9FD4-B63E354BD324 | {timestamps:{“ created”:1578614676,“ modified”:1578615921},“ type”:“ multiple”}8C3BE671-17D1-49FD-A891-D5E69FDF7FC2 | {timestamps:{“ created”:1578614685,“ modified”:1578615173},“ type”:“ single”}

有没有简单的方法可以实现这一目标?

json postgresql jsonpath
2个回答
1
投票

以下内容将满足您的要求。这是桌子。

CREATE TABLE example (
  id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
  data jsonb NOT NULL
);

并且一旦插入数据,这将执行所需的查询。

SELECT id, data
FROM "table"
WHERE (data->>'created')::int8 > 1578614670;

这将从JSONB(不是JSON!)列中提取“创建的”条目作为文本,然后转换为8字节整数(64位int)。对于大表上的顺序扫描,这可能会很慢,因此您需要使用expression index

CREATE INDEX created_idx ON "table" ((data->>'created')::int8);

同样,您要的是jsonb类型,而不是json。只有前者允许这样的提取操作。


0
投票

要降低多层嵌套#>> operator是有用的。然后在比较之前将提取的#>>转换为适当的text

numeric type

相当于:

SELECT id, data FROM tbl
WHERE (data #>> '{timestamps,created}')::numeric > 1578614670;

... WHERE (data -> 'timestamps' ->> 'created')::numeric > 1578614670; 是安全的选择。如果知道 numeric中的所有数字都小于2 ^ 31或2 ^ 63,则可以分别使用createdinteger。在任何情况下,所有提取的值都必须是有效的数字文字。您的样本值显示一个numeric值,但这必须适用于所有值。

为了快速起见,请考虑像Miles建议的表达式索引,将其强制转换为适当的数字类型-并使用适当的括号。

bigint

相关:

  • CREATE INDEX tbl_data_created_idx ON tbl (((data #>> '{timestamps,created}')::numeric)); -- all parentheses required

这里的所有内容都适用于PostgreSQL Index on JSONjson类型,在这方面都相同。

db <>小提琴jsonb(同时展示两者)

© www.soinside.com 2019 - 2024. All rights reserved.