MySQL LIKE关键字未返回预期结果

时间:2016-04-28 20:06:15

标签: mysql sql database

我有一个存储过程,我使用我创建的搜索功能。程序中的查询如下:

    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);

Search Results after running procedure

这些是结果。这与原始表

完全相同

2 个答案:

答案 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,'%')

(但规范并不清楚。)