MySQL 存储过程不搜索通配符
MySQL Stored Procedure not searching wildcard
我在 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%');
它returns搜索范围但不会根据通配符搜索。
|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
我得到了相同的结果。知道我做错了什么吗?
过程的参数与 table 列同名。这是模棱两可的;在查询中,MySQL 将参数名称理解为列名 - 像 name = name
这样的条件始终为真(除非 name
是 null
),因此这些过滤器成为no-ops.
对过程参数使用 non-ambiguous 名称:
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
我在 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%');
它returns搜索范围但不会根据通配符搜索。
|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
我得到了相同的结果。知道我做错了什么吗?
过程的参数与 table 列同名。这是模棱两可的;在查询中,MySQL 将参数名称理解为列名 - 像 name = name
这样的条件始终为真(除非 name
是 null
),因此这些过滤器成为no-ops.
对过程参数使用 non-ambiguous 名称:
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