【问题标题】:How to implement if else functionality in SQL?如何在 SQL 中实现 if else 功能?
【发布时间】:2016-10-26 23:27:20
【问题描述】:

我有一个 SQL 查询,其中有 customer_id、User_id 和名称,这些值将在调用查询时从 java 类提供。 这里的场景是,如果我有 customer_id,那么我应该只考虑 customer_id,不需要考虑 user_id 和 name,如果 customer_id 为 null,那么我必须考虑 user_id,如果 user_id id 为 null,我必须考虑 name。

现在,这个逻辑是在 java if else 语句中实现的。我希望将此逻辑移至 SQL 查询本身,以下是代码:

String query = "SELECT * FROM CUSTOMER WHERE "
if(customer!=null && customer.length!=0)
      query = query+"AND CUSTOMER_ID LIKE '"+customer+"%'";
else if(user!=null && user.length!=0)
      query = query+"AND USER_ID LIKE '"user+"%'";
else if(name!=0 && name.length!=0)
      query = query + "AND NAME LIKE '"+name+"%'";

【问题讨论】:

  • 你能清除它的mysql或sql-server吗?
  • 你使用 JDBC 吗?还是其他?

标签: java mysql sql-server


【解决方案1】:

您构建的 SQL 有一个小缺陷。

条件 WHERE 子句以 AND 开头。唯一的问题是第一个通过的看起来像这样 WHERE AND

要解决这个问题,只需让你的 WHERE 像这样 WHERE 1=1 开始(确保包含尾随空格,然后你可以添加剩余条件

也就是说,您可以创建一个存储过程并传递 3 个变量 @customer、@user 和 @name

SELECT * FROM CUSTOMER WHERE 1=1 
  AND CUSTOMER_ID LIKE Isnull(@customer,'')+'%'
  AND USER_ID LIKE isnull(@user,'')+'%'
  AND NAME LIKE isnull(@name,'')+'%'

【讨论】:

    【解决方案2】:

    请注意,在 SQL 中使用这种灵活的逻辑可能会影响数据库选择良好执行计划的能力。 http://use-the-index-luke.com/sql/where-clause/obfuscation/smart-logic

    如果查询真的像示例中那样非常简单,那么您最好坚持使用

    String query = "SELECT * FROM Customer"
    if(customer!=null && customer.length!=0)
          query = query + " WHERE CUSTOMER_ID LIKE '"+customer+"%'";
    else if(user!=null && user.length!=0)
          query = query + " WHERE USER_ID LIKE '"user+"%'";
    else if(name!=0 && name.length!=0)
          query = query + " WHERE NAME LIKE '"+name+"%'";
    

    以便数据库可以将每个不同的查询识别为遵循不同的执行计划。

    否则,前面的答案是正确的,除了 1=1 AND 似乎是多余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 2021-11-06
      相关资源
      最近更新 更多