PostGreSQL:查找json路径的值大于INT的行

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

我完全是PostGreSQL的新手。但是我认为在关系数据库中使用json / jsonb听起来很有趣。//仅用于信息:我尝试通过带有精简程序的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 search 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

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

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