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

Select query in postgresql to avoid null values of jsonb column

我正在使用 JPA 通过查询 table 从 Postgres 数据库获取数据。我的 table 的专栏之一是 jsonb。 table 中的一段 jsonb 列看起来像这样:

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

我想执行过滤并在结果中排​​除空值。 为此,我使用这段代码查询 table:

  @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);

例如,我想按姓氏 = "Lewandowski" 获取所有条目,我希望得到以下结果:

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

但我得到的不是它而是两行,包括 surname = null

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

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

可能像这样的东西会起作用:

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

如果姓氏是 null,"Lewandowski" 将与其不同,因此不会被 return 编辑。如果请求的姓氏是 ''NULLnull 姓氏将被 returned,我相信这就是您想要的。最后,如果姓氏是 "Lewandowski",并且请求的姓氏是相同的,则它不会不同,因此 return 结果。

该检查是整个姓氏检查所需要的。 rd.params ->> 'surname' != 'null' 检查对我来说似乎是错误的,因为那是 "null" 的实际文本值,你怎么知道没有人姓 "null"?这与检查 null.

不同

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