我有一个SQL查询,其中我有customer_id,User_id和name,这些值将在调用查询时从java类中提供。 这里的场景是,如果我有customer_id,那么我应该只考虑customer_id而不需要考虑user_id和name,如果customer_id为null,那么我必须考虑user_id,如果user_id id为null,我必须考虑名称。
现在,这个逻辑是在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+"%'";
答案 0 :(得分:0)
您构造的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,'')+'%'
答案 1 :(得分:0)
请注意,在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 似乎是多余的。