因此,我有以下可以工作的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”。
但是我也希望能够匹配size中的数值,所以我在这里添加了自定义函数:How to get only Digits from String in 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 ;
现在我有了这个函数,我还想将结果数字连接起来,并将其用于搜索。
因此,我将ExtractNumber(size
)添加到congat中
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搜索无法找到任何匹配项。但是,如果我将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……“但是在这个结果字符串上执行like并不匹配它应该匹配的时间。
有些列有特殊的字符,我尝试将函数结果转换为utf8,但没有效果。
你知道为什么我不能在这个concat字符串上做like吗?
更新:它现在工作了..我必须将转换放在迭代器函数本身中。
RETURN CAST(finNumber AS CHAR);
由于某些原因,带有函数的convert或cast会产生正确的结果,但仍然不允许后面的like比较匹配。
因此,现在使用以下查询
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。
非常奇怪,顺序会影响是否返回任何结果。如果删除了提取数字函数,则排序的任何一种方式都会返回结果。
当我把这个函数放回原处时,我只能在order by desc时得到结果。
谁能告诉我为什么会发生这种奇怪的行为?
发布于 2018-06-07 08:33:07
使用having子句的好处是这个SELECT column_name(s) FROM table_name WHERE where条件GROUP BY column_name具有条件ORDER BY change在使用group by Try通过使用group by更改查询后与聚合函数一起使用,否则使用where where代替Having
https://stackoverflow.com/questions/50691538
复制相似问题