Sql PostgresJSONB和查询

Sql PostgresJSONB和查询,sql,postgresql,jsonb,Sql,Postgresql,Jsonb,我有一个postgres数据库。在“match”表中,我存储了一个类似这样的JSONB,在“when”列中: 它的工作原理类似于存储开始时间和结束时间的对象列表。 现在我想查询所有未过去的匹配项。我该怎么做?是否可以将单个“开始”值与当前数据进行比较?请查看 您可以使用->操作符查询jsonb。对于日期/时间,您需要转换结果以进行比较。此查询仅返回具有未来开始的值: SELECT when_col->>'start' FROM match WHERE to_date(when_col

我有一个postgres数据库。在“match”表中,我存储了一个类似这样的JSONB,在“when”列中:

它的工作原理类似于存储开始时间和结束时间的对象列表。 现在我想查询所有未过去的匹配项。我该怎么做?是否可以将单个“开始”值与当前数据进行比较?

请查看

您可以使用
->
操作符查询jsonb。对于日期/时间,您需要转换结果以进行比较。此查询仅返回具有未来开始的值:

SELECT when_col->>'start' FROM match
WHERE to_date(when_col->>'start','YYYY-MM-DD"T"HH24:MI:SS') >= NOW();
请注意,上面给出的JSON格式不正确。我用小提琴把它分成几行:

CREATE TABLE match
(
  when_col jsonb
 );

 INSERT INTO match (when_col) VALUES ('{"end": "2017-01-04T17:22:13.311693Z", "start": "2017-01-04T16:22:13.311693Z"}');
 INSERT INTO match (when_col) VALUES ('{"end": "2017-02-04T17:22:13.311693Z", "start": "2017-02-04T16:22:13.311693Z"}');
 INSERT INTO match (when_col) VALUES ('{"end": "2019-02-04T17:22:13.311693Z", "start": "2019-02-04T16:22:13.311693Z"}');
 INSERT INTO match (when_col) VALUES ('{"end": "2029-02-04T17:22:13.311693Z", "start": "2029-02-04T16:22:13.311693Z"}');
看一看

您可以使用
->
操作符查询jsonb。对于日期/时间,您需要转换结果以进行比较。此查询仅返回具有未来开始的值:

SELECT when_col->>'start' FROM match
WHERE to_date(when_col->>'start','YYYY-MM-DD"T"HH24:MI:SS') >= NOW();
请注意,上面给出的JSON格式不正确。我用小提琴把它分成几行:

CREATE TABLE match
(
  when_col jsonb
 );

 INSERT INTO match (when_col) VALUES ('{"end": "2017-01-04T17:22:13.311693Z", "start": "2017-01-04T16:22:13.311693Z"}');
 INSERT INTO match (when_col) VALUES ('{"end": "2017-02-04T17:22:13.311693Z", "start": "2017-02-04T16:22:13.311693Z"}');
 INSERT INTO match (when_col) VALUES ('{"end": "2019-02-04T17:22:13.311693Z", "start": "2019-02-04T16:22:13.311693Z"}');
 INSERT INTO match (when_col) VALUES ('{"end": "2029-02-04T17:22:13.311693Z", "start": "2029-02-04T16:22:13.311693Z"}');

缺少有用的信息:你的Postgres版本;表定义(
createtable
语句,显示数据类型和约束;到目前为止(即使它不起作用);所需的示例结果。Postgres版本:9.6.2,表定义在这里并不重要,因为它是一个更复杂场景的示例。“when”列在elixir(Ecto迁移)中刚刚定义为{:数组,:map},并作为jsonb存储在我的数据库中。预期结果:从匹配项中选择*,其中json数组中至少有一个“end”字段大于当前utc DateTime。您的示例值不是合法的json。它应该是数组吗?所以
'[{“end”:“…”,“start”:“…},{…}]“
?它被解码为对象数组,所以我认为它是正确的。你认为呢?这不是意见问题。
错误:类型json的输入语法无效
缺失,有用信息:你的Postgres版本;表定义(
创建表
显示数据类型和约束的语句;到目前为止你有什么(即使它不起作用);理想的示例结果。Postgres版本:9.6.2,表定义在这里并不重要,因为它是一个更复杂场景的示例。“when”列在elixir(Exto migration)中仅定义为{:array,:map},并作为jsonb存储在我的数据库中。理想的结果:从至少有一个“end”的匹配中选择*json数组中的字段大于当前utc DateTime您的示例值不是合法的json。它应该是数组吗?所以
'[{“end”:“…”,“start”:“…},{…}]”
?它被解码为对象数组,所以我认为它是正确的,您认为?这不是意见问题。
错误:类型json的输入语法无效