0

所以我有以下有效的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 排序时得到结果。

谁能告诉我为什么会发生这种奇怪的行为?

4

1 回答 1

0

使用 having 子句的语法是这个 SELECT column_name(s) FROM table_name WHERE 条件 GROUP BY column_name(s) HAVING 条件 ORDER BY 使用 group by 后与聚合函数一起使用 尝试通过使用 group by 更改查询 else 使用 where 而不是有

于 2018-06-07T00:33:06.980 回答