PostgreSQL条件where子句

时间:2017-08-29 11:54:35

标签: sql ruby-on-rails ruby postgresql

在我的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中做到这一点?

3 个答案:

答案 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通常不能为负,因此您可以使用该信息来消除操作强制转换问题。