如果条件在Mysql存储过程中的where子句之后不起作用

时间:2017-03-06 10:17:16

标签: mysql sql if-statement

我正在创建一个Mysql存储过程。我想要做的是在参数值不为空时添加多个和条件。我在存储过程中编写了一个查询,但它无法正常工作。

这是查询

BEGIN
    SELECT 
        c.user_id, u.fname, u.lname, u.email, 
        c.name, c.raised_amount, c.goal_amount, c.created_at 
    FROM
        users u
    INNER JOIN 
        city c ON u.id = c.user_id 
    WHERE 
        c.user_id = user_id 

    IF( city_name !='', and c.name LIKE CONCAT('%',city_name, '%') , 1)

    IF( city_raised_max != '' AND city_raised_min != '', and c.raised_amount BETWEEN city_raised_min AND city_raised_max , '%'), 1);   

END

这三个是参数

  1. USER_ID
  2. city_raised_min
  3. city_raised_max
  4. 我想要的是,如果参数不为空,我想添加多个和条件。

    但是查询在这行上给出了语法错误你的sql语法错误有错误请查看与你的mysql服务器版本相对应的手册,以获得正确的语法。

    IF( city_name !='', and c.name LIKE CONCAT('%',city_name, '%') , 1)
    

    请帮助我解决这个问题,我试图解决这个问题,但仍然没有成功。

    谢谢和问候

3 个答案:

答案 0 :(得分:2)

使用or来解决问题:

BEGIN

    Select c.user_id,u.fname,u.lname,u.email,c.name,c.raised_amount,c.goal_amount,c.created_at from users u
    INNER JOIN city c on u.id = c.user_id 

    WHERE c.user_id=user_id 

    AND (city_name = '' OR city_name IS NULL OR c.name LIKE CONCAT('%',city_name, '%'))

    AND (city_raised_max  = '' OR city_raised_max IS NULL OR city_raised_max >= c.raised_amount)

    AND (city_raised_min = '' OR city_raised_min IS NULL OR city_raised_min <= c.raised_amount)
END

<强> 修改

此查询如何工作?
(city_name = '' OR city_name IS NULL OR c.name LIKE CONCAT('%',city_name, '%'))为例:

如果city_name = ''为真,则不会计算第一个or之后的表达式;
如果city_name = ''为false,则如果city_name IS NULL为真,则不会计算第二个or后的表达式;
如果city_name = ''city_name IS NULL为false,则会计算最后一个表达式。

此外,这里有三个标准,因为我们应该使用and

答案 1 :(得分:1)

使用正确的括号和正确的比较来转发答案以维持逻辑:

BEGIN

Select c.user_id,u.fname,u.lname,u.email,c.name,c.raised_amount,c.goal_amount,c.created_at from users u
INNER JOIN city c on u.id = c.user_id 

WHERE c.user_id=user_id 

AND (city_name = '' OR c.name LIKE CONCAT('%',city_name, '%'))

AND (city_raised_max = '' OR city_raised_min = '' OR c.raised_amount BETWEEN city_raised_min AND city_raised_max);   

END

答案 2 :(得分:-1)

您的查询中有拼写错误。尝试将其替换为:

IF( city_name != '' and c.name LIKE CONCAT('%',city_name, '%'))