【问题标题】:PostgreSQL conditional where clausePostgreSQL 条件 where 子句
【发布时间】:2018-02-06 20:58:47
【问题描述】:

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

【问题讨论】:

    标签: sql ruby-on-rails ruby postgresql


    【解决方案1】:

    检查它是否为空或您的情况如下:

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

    WHERE 子句评估如下:如果变量为空,则WHERE 子句评估为真,因此 - 没有过滤器。如果不是,则继续OR的下一个条件

    【讨论】:

    • 我们如何将它用于多个值?
    • 你能举例说明你的意思吗? @Ulvi
    • 我找到了答案。我想有多个过滤器。我用括号把它们都包起来,并在它们之间写了 AND。
    • 对于字符串,我们也可以等同于''
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我的解决方案:

      我用的是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 时没有情况。

      【讨论】:

        猜你喜欢
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多