繁体   English   中英

PostgreSQL条件where子句

[英]PostgreSQL conditional where clause

在我的Ruby on Rails应用程序中我使用了blazer( https://github.com/ankane/blazer )并且我有以下sql查询:

SELECT *
FROM survey_results sr
LEFT JOIN clients c ON c.id = sr.client_id
WHERE sr.client_id = {client_id}

此查询非常有效。 但我需要添加条件逻辑来检查client_id变量是否存在。 如果是,那么我按这个变量过滤,如果不是,那么我不启动这个where子句。 我怎么能在PostgreSQL中做到这一点?

检查它是否为空或您的条件如下:

WHERE {client_id} IS NULL OR sr.client_id = {client_id}

WHERE子句的计算方法如下:如果变量为空,则WHERE子句的计算结果为true,因此 - 没有过滤器。 如果不是,它继续到OR的下一个条件

我的解决方案

我使用spring数据jpa,本机查询。

这是我的存储库界面签名。 @Query(... where (case when 0 in :itemIds then true else i.id in :itemIds end) ...) List<Item> getItems(@Param("itemIds) List<Long> itemIds)

在调用此方法之前,我检查“itemIds”是否为null。 如果是,我将值设置为0L: if(itemIds == null) { itemIds = new ArrayList<Long>(); itemIds.add(0L); } itemRepo.getItems(itemIds); if(itemIds == null) { itemIds = new ArrayList<Long>(); itemIds.add(0L); } itemRepo.getItems(itemIds);

我的ID从1开始,因此当ID = 0时没有任何情况。

如果有人遇到psql运算符不存在:bigint = bytea问题,这是我的解决方法:

WHERE ({client_id} < 0 AND sr.client_id > {client_id}) OR sr.client_id = {client_id}

请注意,client_id通常不能为负数,因此您可以使用该信息来解决操作转换问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM