可以在同一查询中的多个键中查询数据吗?

时间:2019-11-08 16:58:54

标签: sql json postgresql

我正在尝试使用字符串在数据库中查找某些数据,但是利用多个json键进行签入。

我知道您可以在这种情况下使用单个键“名称”进行查找

SELECT * 
FROM products_product 
WHERE data->>'name' IN ('Value 1', 'Value 2')

我的问题是我保存了两种类型的json值,因此需要同时检查“名称”和“标题”

作为简化示例:

{
  "name": "Value 1"
}

而第二个可能看起来像这样:

{
  "title": "Value 2"
}

如何执行单个查询来检查“名称”和“标题”中的值?

我期望也许能够做类似的事情

SELECT * 
FROM products_product 
WHERE data->>('name', 'title') IN ('Value 1', 'Value 2')

但这不可能!

我想避免重复执行多个查询,因为我知道可以放置数据的键并将它们作为列表或元组获取(无论需要使用什么键)

所以我的最后一个问题是:

如何查询数据库以检查多个字段(如果存在)以获取我定义的值?

我希望两个示例都可以在单个查询中返回,而不仅仅是其中一个

2 个答案:

答案 0 :(得分:0)

您可以使用OR

SELECT * 
FROM products_product 
WHERE data->>'name' IN ('Value 1', 'Value 2')
   OR data->>'title' IN ('Value 1', 'Value 2')

您可以通过仅指定一次值来稍微简化一下:

with input (val) as (
  values ('Value1'), ('Value2') --<< note the parentheses!
)
SELECT * 
FROM products_product 
WHERE data->>'name' IN (select val from input)
   OR data->>'title' IN (select val from input)

答案 1 :(得分:0)

您没有说您使用的是哪个版本。您可以在postgres 12中使用json路径执行此操作。语法有点晦涩,但有可能:

SELECT * FROM products_product 
WHERE jsonb_path_exists(data, 
  'strict $.keyvalue() ? ((@.value == "Value 1" || @.value == "Value 2") && (@.key == "name" || @.key == "title"))');

这将搜索对象根部的每个键/值组合,并查找等于nametitle的键以及等于Value 1Value 2的值。