[英]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.