在存储库中的 SQL 查询中使用 JSON 数组

问题描述 投票:0回答:2

在我的 PostgreSQL 表中,我有一个

body_parts
类型的列
json
。我想检查给定的参数是否包含在我的 json 列中。 此查询在数据库中有效:

select * from worklist_elements we
where body_parts::text like '%"CHEST"%'

但是,它在我的存储库中不起作用,我不确定,但可能是 jpql:

@Override
public List<WorklistElementView> test() {
    return entityManager.createQuery(
                    "SELECT DISTINCT w FROM WorklistElementView w " +
                            "WHERE we.bodyParts::text like '%CHEST%'", WorklistElementView.class)
            .getResultList();
}

是否可以使用这个查询(或另一个查询)来检查存储库中的 json 数组?

postgresql jpql quarkus-panache json-arrayagg
2个回答
0
投票

“在您的存储库中”的查询无法工作,因为表别名是

w
,但您引用了
we

SELECT DISTINCT w FROM WorklistElementView w
WHERE we.bodyParts::text like '%CHEST%'

也不确定未加引号的标识符

bodyParts
和搜索词
'%CHEST%'
中的大写字母。你可能想要:

... WHERE w."bodyParts"::text ILIKE '%chest%'

参见:

但这非常昂贵且不明确。取决于“包含”的确切含义,如果您的 JSON 列实际上是 type

jsonb
(很多),则可以使用索引支持进行更高效的查询。喜欢...

“CHEST”是否作为顶级键或数组元素(而不是值)存在于 jsonb 列中?

... WHERE w."bodyParts" ? 'CHEST'

参见:


0
投票

看看这个例子是否解决了它:

SELECT * , a.json->'parts'
FROM (SELECT '{"parts":"CHEST"}'::JSON as json) AS a
WHERE  a.json->>'parts' = 'CHEST';

注意有两个运算符 -> 用于选择和 ->> 用于谓词。 当他们的角色混淆时,他们不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.