【问题标题】:How do I select all rows that have a particular key in a JSON field?如何选择 JSON 字段中具有特定键的所有行?
【发布时间】:2019-12-06 10:20:47
【问题描述】:

我想选择表中的所有行,其中我的“object_details”JSON 字段包含以下键之一:“subject”、“Subject”、“SUBJECT”。

使用以下示例行:

datetime             | object_details                                             
---------------------+------------------------------------------------------------
2019-07-21T00:01:34Z | {"Sender": "bob@example.com", "Subject": "First email!"}   
2019-07-23T09:30:01Z | {"Sender": "carol@example.com", "subject": "Second email!"}
2019-07-27T22:23:15Z | {"Sender": "dave@example.com", "protocol": "SMTP"}         

我希望结果只提供这些行:

datetime             | object_details                                             
---------------------+------------------------------------------------------------
2019-07-21T00:01:34Z | {"Sender": "bob@example.com", "Subject": "First email!"}   
2019-07-23T09:30:01Z | {"Sender": "carol@example.com", "subject": "Second email!"}

【问题讨论】:

标签: sql json postgresql


【解决方案1】:

您可以使用exists 运算符?|,它将一个键数组作为其输入:

select *
from the_table
where object_details ?| array['subject', 'Subject', 'SUBJECT'];

【讨论】:

  • 这不会抓住一个极端情况,即单词主题包含在一个存储的 json 值中,但不是作为任何键,或作为键名的一部分?如果是这种情况,可能包括引号和冒号? array['"subject":', '"Subject":', '"SUBJECT"':] 会强制进行更精确的匹配吗?
  • @Andrew:不,exists 运算符只查看键,从不查看值。
【解决方案2】:

使用 MySQL 可以使用这种语法来完成。

   SELECT *
    FROM the_table
    WHERE LOCATE("subject", object_details) > 0 ;

PostgreSQL 将是(PostgreSQL 区分大小写):-

 SELECT *
   FROM the_table
   WHERE POSITION('subject' IN LOWER(object_details)) > 0;

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    相关资源
    最近更新 更多