【问题标题】:MySQL Stored Procedure not searching wildcardMySQL存储过程不搜索通配符
【发布时间】:2020-09-14 21:55:43
【问题描述】:

我在 MySQL 中有一个存储过程,如下所示:

CREATE PROCEDURE `sample_search`(
IN upperrange decimal(2,0),
IN lowerrange decimal(2,0),
IN name varchar(31),
IN age varchar(20)
)
BEGIN
Select 
    name,
    age,
    rank,
FROM sampledatabase
WHERE rank BETWEEN lowerrange AND upperrange
    AND name LIKE name
    AND age LIKE age;
END

当我这样调用程序时:

Call sample_search(20, 10, '%bob%', '%teen%');

返回对范围的搜索,但不会根据通配符进行搜索。

|name    |age    |rank    |
|%bob%   |%teen% |15      |
|%bob%   |%teen% |16      |

它只是填写了我要搜索的内容。如果我将程序更改为:

CREATE PROCEDURE `sample_search`(
IN upperrange decimal(2,0),
IN lowerrange decimal(2,0),
IN name varchar(31),
IN age varchar(20)
)
BEGIN
Select 
    name,
    age,
    rank,
FROM sampledatabase
WHERE rank BETWEEN lowerrange AND upperrange
    AND name LIKE CONCAT('%', name, '%')
    AND age LIKE CONCAT('%', age, '%');
END

我得到相同的结果。任何想法我做错了什么?

【问题讨论】:

    标签: mysql string stored-procedures where-clause sql-like


    【解决方案1】:

    过程的参数与表列具有相同的名称。这是模棱两可的;在查询中,MySQL 将参数的名称理解为列名称 - 像 name = name 这样的条件始终为真(除非 namenull),因此这些过滤器变为无操作。

    对过程参数使用明确的名称:

    CREATE PROCEDURE `sample_search`(
        IN p_upperrange decimal(2,0),
        IN p_lowerrange decimal(2,0),
        IN p_name varchar(31),
        IN p_age varchar(20)
    )
    BEGIN
        Select 
            name,
            age,
            rank,
        FROM sampledatabase
        WHERE rank BETWEEN p_lowerrange AND p_upperrange
            AND name LIKE p_name
            AND age LIKE p_age;
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      相关资源
      最近更新 更多