在我的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中做到这一点?
答案 0 :(得分:16)
检查它是否为空或您的条件如下:
WHERE {client_id} IS NULL OR sr.client_id = {client_id}
WHERE
子句的计算方法如下:如果变量为空,则WHERE
子句的计算结果为true,因此没有过滤器。如果没有,它将继续OR
答案 1 :(得分:1)
我的解决方案:
我使用spring data 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”是否为空。如果是,我将值设置为0L:
if(itemIds == null) {
itemIds = new ArrayList<Long>();
itemIds.add(0L);
}
itemRepo.getItems(itemIds);
我的ID从1开始,因此ID = 0时不会出现任何情况。
答案 2 :(得分:0)
如果没有人遇到 psql运算符:bigint = bytea 问题,这是我的解决方法:
WHERE ({client_id} < 0 AND sr.client_id > {client_id}) OR sr.client_id = {client_id}
请注意,client_id通常不能为负,因此您可以使用该信息来消除操作强制转换问题。