【问题标题】:How to use an user variables in MySQL LIKE clause?如何在 MySQL LIKE 子句中使用用户变量?
【发布时间】:2012-01-22 04:15:39
【问题描述】:

我正在尝试设置一些简单的 SQL 脚本来帮助进行一些短期数据库管理。 因此,我正在设置变量以尝试更轻松地重用这些脚本。

我遇到的问题是 LIKE 子句。

SET @email = 'test@test.com';

SELECT email from `user` WHERE email LIKE '%@email%';

所以我想让它根据变量中的电子邮件 SET 查找结果。如果我在 LIKE 子句中手动输入电子邮件,则查询有效。

如何让 LIKE 子句与用户变量一起使用?

更新: @dems 的答案适用于这个简单的案例,但我在处理更复杂的查询时遇到了麻烦。

SET @email = 'test@test.com';

SELECT project.projectno, project.projectname, login.username, 
CONCAT(login.firstname, ' ', login.lastname), projectuser.title 
FROM projectuser 
INNER JOIN login ON projectuser.uid = login.uid 
LEFT JOIN project ON projectuser.pid = project.pid
WHERE login.username LIKE CONCAT ('%', @email, '%')

给我错误“FUNCTION mydb.CONCAT 不存在”

查询在没有 CONCAT() 的情况下工作:

SET @email = 'test@test.com';

SELECT project.projectno, project.projectname, login.username, 
CONCAT(login.firstname, ' ', login.lastname), projectuser.title 
FROM projectuser 
INNER JOIN login ON projectuser.uid = login.uid 
LEFT JOIN project ON projectuser.pid = project.pid
WHERE login.username LIKE @email

【问题讨论】:

  • 删除CONCAT 和大括号( 之间的空格字符。应该是CONCAT(...,而不是CONCAT (
  • @a1ex07 是的,删除该空间修复了它。谢谢。
  • 我知道我们在这里不教语法,但我肯定不会是唯一一个被问题标题中的错误困扰的人,“如何使用用户变量在 MySQL LIKE 子句中?”
  • @qualebs 在我编辑问题时发生。应该是迟到了。我建议您继续并发布对问题的编辑。

标签: mysql sql database


【解决方案1】:
SET @email = 'test@test.com';

SELECT email from `user` WHERE email LIKE CONCAT('%', @email, '%');

【讨论】:

  • 这适用于这种更简单的情况。我扩展了我的查询以包含一些 JOINS,现在它给了我一个错误,告诉我“FUNCTION mydb.CONCAT 不存在”。我还发现 (SET @email = '%test@test.com%';) 允许我跳过 CONCAT,但我不喜欢将搜索语法与数据配对。
  • @Chris - 您需要将您的新查询作为一个整体展示,因为其中一定有一些新错误。 CONCAT() 只是将多个字符串连接在一起,在我的示例中使用一个变量作为字符串之一。
  • 是的,我用更复杂的查询更新了原始问题。
  • @Chris - 不知道,它应该可以工作。拼命抓住野外将是删除CONCAT(之间的空格
  • 智能解决方案,谢谢 :)
【解决方案2】:

无需 concat() 即可工作:

LIKE '%{$var}%'

(Mysql 5.+)

【讨论】:

  • 这应该是 php 辅助答案吗?
  • 那是受SQL注入的影响。
【解决方案3】:

你可能有错误

Error Code: 1267. Illegal mix of collations for operation 'like'    0.016 sec

在这种情况下,您需要指定与您的表相同的排序规则:

SET @email = 'test@test.com' COLLATE utf8_unicode_ci;

【讨论】:

    【解决方案4】:

    我在使用 LIKE 语句之前使用 CONCAT 函数解决了:

    SET @email = 'test@test.com';
    set @email = CONCAT('%',@email,'%');
    SELECT email from `user` WHERE email LIKE @email;
    

    对我来说很好用

    【讨论】:

      【解决方案5】:
      BEGIN 
          SET @emailid = CONCAT('%', 'email@email.com' ,'%');
          SET @t1 =CONCAT('SELECT * FROM user WHERE email LIKE ''', @emailid, '''');
          PREPARE stmt3 FROM @t1;
          EXECUTE stmt3;
          DEALLOCATE PREPARE stmt3;
      END
      

      【讨论】:

        【解决方案6】:

        无需CONCAT,只需使用'%'+变量+'%':

        SET @email = 'test@test.com';
        SELECT email from `user` WHERE email LIKE '%' + @email + '%';
        

        【讨论】:

        • 它在 MSSQL 中工作,对于 MYSQL,MatBailie 的答案应该工作。
        【解决方案7】:

        22 年 1 月,我在使 LIKE 命令工作时遇到问题。我通过回显变量值和我的 SQL 语句发现,quote 函数在变量周围放置了刻度线。获取业务类型的代码:

        isset($_POST['button']) ? $businesstype = get_post($pdo, 'button'): 
        $businesstype  = get_post($pdo, 'businesstype');
        
        function get_post($pdo, $var)
          {
            return htmlentities($pdo->quote($_POST[$var]));
          }
        

        $businesstype 的回声:“理发师”

        SQL 的回显:选择 BusinessName、MemberNum、Street、City FROM member WHERE verify = TRUE AND businesstype LIKE 'Barber' Order by featurelevel desc、membershipdate desc、businessname

        由于单引号已经在搜索值周围,要使用 LIKE,我必须在第一个刻度标记之后和最后一个标记之前获取 %。 我使用了字符串替换函数和 concat 运算符的组合: 将原始单引号替换为空,并在搜索值周围连接 '% 和 %'。

        $businesstype ="'%" . str_ireplace("'","",$businesstype) . "%'";
        

        。 为我工作。我希望它对某人有所帮助。如果我以某种方式撤消 SQL 注入保护措施,请告诉我。

        【讨论】:

        • 请不要破坏您自己的帖子。如果您想删除您的答案,只需删除您的答案即可。
        【解决方案8】:

        使用与 oracle 相同的语法似乎可以工作:

        SELECT email from user WHERE email LIKE '%' || @email || '%';

        【讨论】:

        • 您的解决方案不会仅过滤包含“电子邮件”的字段。它实际上返回所有字段,因为您的语法意味着“电子邮件”或其他任何内容
        • 这基本上返回每一行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 2018-08-23
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多