我正在尝试使用字符串在数据库中查找某些数据,但是利用多个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')
但这不可能!
我想避免重复执行多个查询,因为我知道可以放置数据的键并将它们作为列表或元组获取(无论需要使用什么键)
所以我的最后一个问题是:
如何查询数据库以检查多个字段(如果存在)以获取我定义的值?
我希望两个示例都可以在单个查询中返回,而不仅仅是其中一个
答案 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"))');
这将搜索对象根部的每个键/值组合,并查找等于name
或title
的键以及等于Value 1
或Value 2
的值。