我正在创建一个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
这三个是参数
我想要的是,如果参数不为空,我想添加多个和条件。
但是查询在这行上给出了语法错误你的sql语法错误有错误请查看与你的mysql服务器版本相对应的手册,以获得正确的语法。
IF( city_name !='', and c.name LIKE CONCAT('%',city_name, '%') , 1)
请帮助我解决这个问题,我试图解决这个问题,但仍然没有成功。
谢谢和问候
答案 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, '%'))