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 编辑。如果请求的姓氏是 ''
或 NULL
,null
姓氏将被 returned,我相信这就是您想要的。最后,如果姓氏是 "Lewandowski",并且请求的姓氏是相同的,则它不会不同,因此 return 结果。
该检查是整个姓氏检查所需要的。 rd.params ->> 'surname' != 'null'
检查对我来说似乎是错误的,因为那是 "null" 的实际文本值,你怎么知道没有人姓 "null"?这与检查 null
.
不同
您也可以将同样的方法应用于其他字段。
我正在使用 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 编辑。如果请求的姓氏是 ''
或 NULL
,null
姓氏将被 returned,我相信这就是您想要的。最后,如果姓氏是 "Lewandowski",并且请求的姓氏是相同的,则它不会不同,因此 return 结果。
该检查是整个姓氏检查所需要的。 rd.params ->> 'surname' != 'null'
检查对我来说似乎是错误的,因为那是 "null" 的实际文本值,你怎么知道没有人姓 "null"?这与检查 null
.
您也可以将同样的方法应用于其他字段。