【问题标题】:Concatening LIKE with Stored Procedure's parameter using MySQL使用 MySQL 将 LIKE 与存储过程参数连接起来
【发布时间】:2013-09-18 13:12:15
【问题描述】:

目标

使用 MySQL 将参数与 LIKE 的 % 运算符连接。

问题

我的数据库中有以下查询,它很好地返回了我的结果:

SELECT people.LOGIN, people.EMAIL FROM people
WHERE people.LOGIN LIKE 'o%'
ORDER BY people.LOGIN ASC
LIMIT 10;

但我想使用存储过程调用此函数,而不是使用'o%',我想使用'<myvariable>%',但我无法做到这一点。

场景

我在我的程序中尝试了以下方法:

BEGIN
    SELECT people.EMAIL FROM people
    WHERE people.LOGIN LIKE CONCAT(expression, '%')
    ORDER BY people.LOGIN ASC
    LIMIT 10;
END

结果? 空。此查询没有返回任何内容。

有人有什么想法可以帮助我吗?

【问题讨论】:

  • 第二个查询是您的实际查询吗? CONCAT(expression, '%') 部分 - 什么是表达式?
  • 第二个查询是我的存储过程。它们是同一个东西,但一个应用于存储过程,另一个是“即插即用”查询。

标签: mysql sql stored-procedures


【解决方案1】:

通常实际传入的不是我们所想的。

检查参数:

  • 不为空
  • 没有前导或尾随空格

试试这个来防范上述情况:

WHERE people.LOGIN LIKE CONCAT(TRIM(IFNULL(expression, '')), '%')

【讨论】:

  • 没有空格,它是一个有效的字符串,但仍然返回零结果。
【解决方案2】:

您需要使用prepared statements

使用查询创建一个字符串,并使用准备好的语句执行它。像这样 -

SET @query = CONCAT('SELECT * FROM table1 WHERE column1 LIKE ''', expression, '%''');
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

【讨论】:

  • 我不知道 prepared statements — 感谢您向我介绍这个惊人的功能。给我更多的知识。我用了你的解决方案和触摸!像魅力一样工作!谢谢! +1
  • 检查expression参数,如果是NULL,那么结果@query也会是NULL。
  • 您“不需要”像这样一起使用准备好的语句和连接查询可能会使您面临重大的安全风险; LIKE CONCAT(variable,'%') 在原始查询中工作正常,在这种情况下不需要清理变量中的值。您最初的问题很可能是由于变量不包含您的想法。
  • 我认为@Bohemian 已经抓住了我的想法,本质上问题可能出在变量中,而不是查询的构造方式;我只是想添加关于将外部数据混合到查询中的常见危险警告,在这种情况下,可以避免。
  • @Michael-sqlbot 我照你说的做了,但即使参数中有一个值,结果也是零。只有当我使用字母 a 作为参数时,查询才会返回结果。更具体地说,单个结果。我不明白发生了什么:我用撇号表示的字母填充 SP 的参数,结果始终为零。如果我设置一个没有撇号的数字,那么我会得到正确的结果。会发生什么?
【解决方案3】:

您可以使用 LOCATE。示例:

位置(pParamText,column1)> 0

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 2012-04-25
    • 2019-06-28
    • 1970-01-01
    • 2017-06-16
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多