首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有自定义函数结果的mysql concat_ws阻止like '%str%‘工作

带有自定义函数结果的mysql concat_ws阻止like '%str%‘工作
EN

Stack Overflow用户
提问于 2018-06-05 11:22:50
回答 1查看 137关注 0票数 0

因此,我有以下可以工作的sql:

代码语言:javascript
复制
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?

代码语言:javascript
复制
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中

代码语言:javascript
复制
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条件来检查特定的品牌名称...

代码语言:javascript
复制
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吗?

更新:它现在工作了..我必须将转换放在迭代器函数本身中。

代码语言:javascript
复制
RETURN CAST(finNumber AS CHAR);

由于某些原因,带有函数的convert或cast会产生正确的结果,但仍然不允许后面的like比较匹配。

因此,现在使用以下查询

代码语言:javascript
复制
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时得到结果。

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

EN

回答 1

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50691538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档