在postgresql中选择查询以避免jsonb列的空值

时间:2018-06-08 14:18:34

标签: sql postgresql spring-data-jpa jsonb

我正在使用JPA通过查询表从Postgres数据库获取数据。我桌子的一栏是jsonb。 并且该表中的jsonb列的片段看起来像这样:

{"name": "Robert", "surname": "Lewandowski", "app_number": "46323875"}
{"name": "Robert", "surname": null, "app_number": "46323876"}
{"name": "Franck", "surname": "Ribery", "app_number": "46323877"}

我想在结果中实现过滤并排除空值。 为了做到这一点,我使用这段代码查询表:

  @Query(value = "SELECT * FROM request_data rd\n" +
        "         WHERE(rd.params ->> 'name' = NULLIF(?1,'') is NULL or (rd.params ->> 'name' = ?1 and rd.params ->> 'name' != 'null'))\n" +
        "         and (rd.params ->> 'surname' = NULLIF(?2,'') is NULL or (rd.params ->> 'surname' = ?2 and rd.params ->> 'surname' != 'null'))\n" +
        "         and (rd.params ->> 'app_number' = NULLIF(?3,'') is NULL or (rd.params ->> 'app_number' = ?3 and rd.params ->> 'app_number' != 'null')) order by created_at DESC", nativeQuery = true)
List<RequestData> findTest(String name, String surname, String appNumber);

例如,我想通过surname =“Lewandowski”获取所有条目,我期待以下结果:

{"name": "Robert", "surname": "Lewandowski", "app_number": "46323875"}

但是我有两行,包括surname = null

,而不是它
{"name": "Robert", "surname": "Lewandowski", "app_number": "46323875"}
{"name": "Robert", "surname": null, "app_number": "46323876"}

我尝试了很多不同的查询和语法,但到目前为止,我无法在结果中删除空值。

1 个答案:

答案 0 :(得分:1)

这样的事情可能有用:

AND (rd.params->>'surname') IS NOT DISTINCT FROM NULLIF(?2, '')

如果姓氏为null,“Lewandowski”将与其不同,因此不会被退回。如果请求的姓氏为''NULL,则会返回null姓氏,我相信这是您想要的。最后,如果姓氏是“Lewandowski”,并且所要求的姓氏是相同的,那么它将不会是明显的,因此返回该结果。

完整的姓氏检查只需要检查。 rd.params ->> 'surname' != 'null'检查对我来说似乎不对,因为这是一个实际的文本值“null”,你怎么知道没有人有一个名为“null”的姓氏?这与检查null不一样。

您也可以将同样的方法应用于其他字段。