我有一个存储过程,我使用我创建的搜索功能。程序中的查询如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `advanced_search`(IN major_name VARCHAR(45),
OUT major_code INT, IN classification VARCHAR(45), IN job_class VARCHAR(45))
BEGIN
SELECT major_id INTO major_code FROM major
WHERE major = major_name;
SET @classification = classification;
SELECT * FROM job WHERE (major = major_code) OR (classification LIKE '%@classification%') OR (job_type = job_class);
END
我遇到LIKE关键字子句的问题。我想检查分类字段中的值是否包含@classification变量。出于某种原因,当我挑出使用该关键字的子句时(通过删除WHERE语句中的第一个和第三个子句),它不会返回任何内容。
有关于如何解决这个问题的建议吗?
此外,在结果对象中找到下面显示的对象是否常见?
{
"fieldCount": 0,
"affectedRows": 0,
"insertId": 0,
"serverStatus": 34,
"warningCount": 0,
"message": "",
"protocol41": true,
"changedRows": 0
}
编辑:这是我打电话的查询
set @major_name = 'Chemical Engineering';
set @major_code = 0;
set @classification = 'Freshman';
set @job_class = 'Assistant';
call aggie_soop.advanced_search(@major_name, @major_code, @classification, @job_class);
这些是结果。这与原始表
完全相同答案 0 :(得分:0)
需要做一些小改动:
CREATE DEFINER=`root`@`localhost` PROCEDURE `advanced_search`(IN major_name VARCHAR(45),
OUT major_code INT, IN classification VARCHAR(45), IN job_class VARCHAR(45))
BEGIN
SELECT major_id INTO major_code FROM major
WHERE major = major_name;
SET @classification = classification;
SELECT * FROM job WHERE (major = major_code) OR (classification LIKE '%' || @classification || '%') OR (job_type = job_class);
END
答案 1 :(得分:0)
我认为您不需要用户定义的变量,您可以引用过程参数。
您可以使用MySQL CONCAT()函数将百分号文字与值连接。
我更喜欢限定所有列引用,并使用过程变量的命名约定来避免名称冲突。虽然MySQL并不关心,但它使未来的读者更容易破解意图。
CREATE DEFINER=`root`@`localhost`
PROCEDURE `advanced_search`
( IN p_major_name VARCHAR(45)
, OUT p_major_code INT
, IN p_classification VARCHAR(45)
, IN p_job_clas VARCHAR(45)
)
BEGIN
SELECT m.major_id INTO p_major_code
FROM major m
WHERE m.major = p_major_name
LIMIT 1
;
SELECT j.*
FROM job j
WHERE (j.major = p_major_code)
OR (j.classification LIKE CONCAT('%',p_classification,'%')
OR (j.job_type = p_job_class)
;
END
(我相信可以在程序中“读取”OUT参数的值,但我以前从未这样做过。)
请注意,如果p_classification字符串是零长度字符串,则将返回分类列中具有非NULL值的每一行。
你可能想要这样的东西:
OR (p_classification <> '' AND j.classification LIKE CONCAT('%',p_classification,'%')
(但规范并不清楚。)