因此,我使用了以下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
这可以很好地返回任何列中包含搜索字符串的记录,例如“ContinentalContact”â® 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
)进入康加特
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
当涉及函数时,like搜索无法找到任何匹配项。但是,如果我把having改为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确实返回“2147483647contineralvancofourseason 20473361205/7….”,但是在这个结果字符串上执行like并不匹配它应该在什么时候执行。
有些列有特殊字符,我尝试将函数结果强制转换为utf8,但没有效果。
你知道为什么我不能在这根弦上做这样的动作吗?
最新消息:它正在工作。。我必须将转换放在迭代器函数本身中。
RETURN CAST(finNumber AS CHAR);
出于某种原因,使用内部函数进行convert或cast将生成正确的结果,但之后仍不允许类似的比较匹配。
下面的查询
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个结果。
奇怪的是,订单会影响结果的返回。如果删除了extract number函数,则按任意一种方式排序都会返回结果。
当我把这个函数放回去时,我只能在order by desc时得到结果。
有人能告诉我为什么会发生这种奇怪的行为吗?
1条答案
按热度按时间j7dteeu81#
using having子句的snytax是这个select column\u name from table\u name where condition group by column\u name having condition order by having用于aggregated函数using group by try to change query by use group by else use where instead having