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

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

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

//仅用于信息:我尝试使用带有Dapper的C#.NET Core WebAPI来实现它

例如,我想要一个带有(多维)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个回答
4
投票

要降低多层嵌套#>> 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。您的示例显示了有效的数字文字,但这必须适用于all提取值。

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

bigint

相关:

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

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

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


2
投票

编辑:删除了Erwin指出的错误(并赞成here)。由于其他信息可能会有用,请留下其余答案。

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

Erwin's answer

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

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

这将从SELECT id, data FROM "table" WHERE (data->'timestamps'->>'created')::int8 > 1578614670; 列中提取“创建的”条目作为文本,然后转换为8字节整数(64位int)。对于大表上的顺序扫描,这可能会很慢,因此您需要使用JSONB

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