所以我有以下有效的sql:
SELECT CONCAT_WS('',`brand`,`pattern`,`product_code`,`size`,`normal_price`,`sale_price`,`text_special`,`load_index`,`speed_index`,`id`) `all_columns` FROM baz_tyres
HAVING (`all_columns` LIKE '%con%')
ORDER BY brand asc
LIMIT 0, 10
这可以很好地返回任何列中包含搜索字符串的任何记录,例如“ContinentalContiCrossContact® LX21549340225/65R17”。
但后来我也希望能够只匹配大小中的数值,所以我添加了我在这里缠绕的自定义函数: 如何在 mysql 中仅从字符串中获取数字?
DELIMITER $$
CREATE FUNCTION `ExtractNumber`(in_string VARCHAR(50))
RETURNS INT
NO SQL
BEGIN
DECLARE ctrNumber VARCHAR(50);
DECLARE finNumber VARCHAR(50) DEFAULT '';
DECLARE sChar VARCHAR(1);
DECLARE inti INTEGER DEFAULT 1;
IF LENGTH(in_string) > 0 THEN
WHILE(inti <= LENGTH(in_string)) DO
SET sChar = SUBSTRING(in_string, inti, 1);
SET ctrNumber = FIND_IN_SET(sChar, '0,1,2,3,4,5,6,7,8,9');
IF ctrNumber > 0 THEN
SET finNumber = CONCAT(finNumber, sChar);
END IF;
SET inti = inti + 1;
END WHILE;
RETURN CAST(finNumber AS UNSIGNED);
ELSE
RETURN 0;
END IF;
END$$
DELIMITER ;
现在我有了这个功能,我还想连接结果数字并将其用于搜索。
所以我size
在 congat 中添加了 ExtractNumber()
SELECT CONCAT_WS('',ExtractNumber(`size`),`brand`,`pattern`,`product_code`,`size`,`normal_price`,`sale_price`,`text_special`,`load_index`,`speed_index`,`id`) `all_columns` FROM baz_tyres
HAVING (`all_columns` LIKE '%con%')
ORDER BY brand asc
LIMIT 0, 10
当涉及该功能时,类似搜索无法找到任何匹配项。但是,如果我将 havving 更改为检查特定品牌名称的 where 条件...
SELECT CONCAT_WS('',ExtractNumber(`size`),`brand`,`pattern`,`product_code`,`size`,`normal_price`,`sale_price`,`text_special`,`load_index`,`speed_index`,`id`) `all_columns` FROM baz_tyres
WHERE (`brand` LIKE '%con%')
ORDER BY brand asc
LIMIT 0, 10
然后我可以看到,确实带有内部函数的 concat 确实可以返回“2147483647ContinentalVancoFourSeason 20473361205/7 ....”,但是在这个结果字符串上执行类似的操作并不匹配。
有些列有特殊字符,我尝试将函数结果转换为 utf8,但没有效果。
任何想法为什么我不能在这个 concat 字符串上做一个喜欢?
更新:它现在可以工作了。我不得不将转换放在迭代器函数本身中。
RETURN CAST(finNumber AS CHAR);
由于某种原因,使用内部函数进行转换或强制转换会产生正确的结果,但之后仍然不允许类似的比较匹配。
所以现在下面的查询
SELECT *,CONCAT_WS('',ExtractNumber_CHAR(`size`),`brand`,`pattern`,`product_code`,`size`,`normal_price`,`sale_price`,`text_special`,`load_index`,`speed_index`,`id`) `all_columns`
FROM `baz_tyres`
HAVING (`all_columns` LIKE '%nat%' )
ORDER BY `brand` DESC
LIMIT 0,10
产生了预期的结果,但是现在出现了一个非常奇怪的新问题..
如果我执行完全相同的查询,但按 ASC 而不是 DESC 排序,那么我得到 0 个结果。
真的很奇怪,订单会影响天气,任何结果都会返回。如果删除了提取编号函数,则以任何一种方式排序都会返回结果。
当我把函数放回去时,我只能在按 desc 排序时得到结果。
谁能告诉我为什么会发生这种奇怪的行为?