在 PostgreSQL 中比较格式为 JSON 的文本列中的日期

Comparing dates within a text colum, formated as JSON, in PostgreSQL

提问人:Sawta 提问时间:4/30/2022 更新时间:4/30/2022 访问量:347

问:

我有一个奇怪的设置,我正在使用,我有一个包含多列的表。其中一列,我称之为“weird-column”,数据类型为文本,存储在该列的信息似乎以 JSON 形式列出。

“为什么此列数据类型未设置为JSON或JSONB?”不知道 - 这是我被赋予使用的数据库。

例:

{
  "id": "numbers-and-letters-go-here":[
    {
      "Code": "thing"
    }
  ],
  "issuedt": "03/18/1989",
  "expirationdate": "03/18/3089",
  "firstname": "Funky",
  "middlename": "Cold",
  "lastname": "Medina"
}

现在,我需要比较存储在 weird-column 中的日期,看看是否有任何到期日期在 issuedt 之前到期。我需要对 weird-column 中的每个条目执行此操作,并查看每条记录的条目的输出,这些记录甚至在发布之前就已过期。

我最初的计划是使用类似

select * from table_1
where issuedt < expriationdate

但是,由于所有这些都是存储在 weird-column 的数据,因此这是行不通的。有没有办法指定这一点?类似的东西

select * from table_1
where weird-column.issuedt < weird-column.expriationdate

我没有知识来描述我需要做什么,但对我需要做什么有一个模糊的理解。任何建议都会非常有帮助。

数据库 postgresql 文本 sqldatatypes 日期比较

评论

0赞 SebDieBln 4/30/2022
“每个条目”到底是什么意思?一条记录是否可以包含包含多个条目的 JSON,或者我们可以假设每条记录都有一个结构类似于您给出的示例的 JSON?

答:

1赞 Sharang Chopra 4/30/2022 #1

如果你是一个格式良好的json,那么你可以简单地把它转换为jsonbweird-column

例如

select '{"name":"xyz", "age" : 34}'::jsonb

转换为 JSON 后,您可以使用包括运算符在内的各种运算符来选择 JSON 中的特定字段并对其进行进一步操作->

select (('{"name":"xyz", "age" : 34}'::jsonb) -> 'age')::integer

请查看此页面了解更多详情 https://www.postgresql.org/docs/9.5/functions-json.html

评论

0赞 Sawta 5/4/2022
感谢您的回复。如果我将其“强制转换”到 jsonb,它会在数据库中创建一个新列吗?我只有对此数据库的读取访问权限。我试图做的中心任务只是查询已经存在的信息 - 由于一些复杂的法律原因,我不允许修改其中存在的任何内容。
1赞 Sharang Chopra 5/4/2022
不,它不会创建新列,而是动态操作。
0赞 Sawta 5/10/2022
Sharang,谢谢你的回复。我会试一试。
1赞 jian 4/30/2022 #2

演示
您的文本列格式不正确,无法将其转换为 jsonb/json。

"id": "numbers-and-letters-go-here":[
    {
      "Code": "thing"
    }
  ]

jsonb/json更像是,它不能。 我把它改成了"key":"value""key":"value": "value1"

  "id": "numbers-and-letters-go-here",
  "id1": [
    {
      "Code": "thing"
    }
  ]

将 IssueDT 与 ExpirationDate 进行比较的最终代码

SELECT
    to_date((weird::jsonb)->>'issuedt','MM/DD/YYYY')
FROM
    t1
where to_date((weird::jsonb)->>'issuedt','MM/DD/YYYY')
    <  to_date((weird::jsonb)->>'expirationdate','MM/DD/YYYY') ;

评论

0赞 Sawta 5/4/2022
非常感谢您的全面回复。老实说,我希望在如何呈现这些数据方面做很多事情。不幸的是,我不会做出这些决定。我被赋予了读取和查询现有数据库信息的能力,但没有任何权限来更改其中的任何内容。您知道在不改变文本列的形成方式的情况下,任何接近您建议的内容是否可以行得通吗?我完全同意你所说的话,我只是处于一个我无法做任何事情来改变它的格式的地方。
1赞 jian 5/4/2022
尝试文本字符串操作,使其格式化看起来像 JSON。
0赞 Sawta 5/10/2022
马克,谢谢你提供的信息。我会确保对此进行调查。