【问题标题】:Postgres jsonb and queryPostgres jsonb 和查询
【发布时间】:2018-04-03 13:19:40
【问题描述】:

我有一个 postgres 数据库。在“匹配”表中,我在“何时”列中存储了一个这样的 JSONB:

{{"end": "2017-01-04T17:22:13.311693Z", "start": "2017-01-04T16:22:13.311693Z"}, {"end": "2017-01-04T17:22:13.311693Z", "start": "2017-01-04T16:22:13.311693Z"}}

它就像一个存储开始时间和结束时间的对象列表。 现在我想查询所有未过去的匹配项。我怎样才能做到这一点?是否可以将单个“开始”值与当前数据进行比较?

【问题讨论】:

  • 缺少有用的信息:您的 Postgres 版本;表定义(CREATE TABLE 显示数据类型和约束的语句;到目前为止您所拥有的(即使它不起作用);期望的示例结果。
  • Postgres 版本:9.6.2,表定义在这里并不重要,因为它是更复杂场景的示例。 “when”列在 elixir(Ecto 迁移)中被定义为 {:array, :map},并在我的数据库中存储为 jsonb。期望的结果:SELECT * FROM Matches WHERE json 数组中的至少一个“end”字段大于当前 utc 日期时间
  • 您的示例值不是合法的 JSON。它应该是一个数组吗?那么'[{"end": "...", "start": "..."}, {...}]'?
  • 它被解码为对象数组,所以我认为它是正确的
  • 你觉得呢?这不是意见问题。 ERROR: invalid input syntax for type json

标签: sql postgresql jsonb


【解决方案1】:

看看this SQL Fiddle

您可以使用->> 运算符查询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"}');

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2016-07-24
    相关资源
    最近更新 更多