RLIKE和LIKE在存储过程中的奇怪行为

时间:2014-12-18 09:57:14

标签: mysql stored-procedures sql-like

我正在编写一些存储过程来自动化数据库上经常使用的查询,但我收到的似乎是非常奇怪的行为。

 DELIMITER //
 CREATE PROCEDURE SelectOrders(IN item VARCHAR(30), IN category VARCHAR(30))
 BEGIN
     SELECT 
         Order_ID,
         Category,
         Item,
         Discount
     FROM 
         Orders 
     WHERE 
         Item RLIKE item 
         AND Category LIKE category 

如果我调用我的存储过程(CALL SelectOrders('.*', '%');)以返回所有匹配项(即使用RLIKELIKE的通配符),它将返回结果,而不是预期结果,使用RLIKELIKE的列(因此,此示例中的项目和类别)将分别显示.*%

所以Orders表包含 -

 Order_ID   ||   Category   ||  Item   ||  Discount 
 --------------------------------------------------
      1     ||   Clothing   ||  Hat    ||   0 
      2     ||   Books      ||  Bible  ||   0  

会返回 -

 Order_ID   ||   Category   ||  Item   ||  Discount 
 --------------------------------------------------
      1     ||      %       ||   .*    ||   0 
      2     ||      %       ||   .*    ||   0  

如果我更改了我传入的参数的值(例如.*at参数的item),它将返回表中的相关行(因此,在这种情况下, Order_ID 1)但它仍将显示IN参数而不是返回的结果。

我不确定这里发生了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您应该为参数命名,使它们与列名不同。试试这个:

DELIMITER //
 CREATE PROCEDURE SelectOrders(IN v_item VARCHAR(30), IN v_category VARCHAR(30))
 BEGIN
     SELECT Order_ID, Category, Item, Discount
     FROM Orders 
     WHERE Item RLIKE v_item AND Category LIKE v_category 

使用反引号对如何解释值没有影响。当您说Item RLIKE item时,别名item将解析为表格中的列。两次。您需要以不同方式命名变量以区分两者。