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

raogr8fs  于 2022-12-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(225)

在我的PostgreSQL表中,我有一个json类型的body_parts列。我想检查给定的参数是否包含在我的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数组?

krugob8w

krugob8w1#

查看此示例是否可解决此问题:

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

注意,这里有两个操作符-〉表示选择,-〉〉表示 predicate 。当角色混淆时,它们不起作用。

qv7cva1a

qv7cva1a2#

查询"in your repository"无法工作,因为表别名为w,但您引用了we

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

此外,不确定未加引号的标识符bodyParts和搜索项'%CHEST%'中的大写字母。您可能需要:

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

参见:

  • PostgreSQL列名是否区分大小写?
  • 下部LIKE与iLIKE

但这是非常昂贵和不明确的。取决于"contained"的确切含义,如果您的JSON列实际上是type jsonb,则可以使用索引支持进行更高效的查询。例如...

  • "CHEST"在jsonb列中是否作为顶级键或数组元素(而不是值)存在?*
... WHERE w."bodyParts" ? 'CHEST'

参见:

  • 用于在JSON数组中查找元素的索引

相关问题