Mysql函数删除少于3个字符的单词

时间:2013-04-22 09:12:24

标签: mysql string function

我有一个问题。

在我的数据库中,我有一些存储过程可以搜索我拥有的关键字。在我的GUI(在asp.net中)我有一个处理我的问题的函数,但我需要在Mysql中使用相同的函数。

我需要从少于3个字符的单词中删除一个字符串,并且只保留包含更多单词的单词。例如,“阿姆斯特丹的酒店”将返回“酒店阿姆斯特丹”。

编辑:字段在innodb全文,因此我需要实际删除少于3的所有单词,因为我的存储过程需要全部“”并用“+”替换它。 FULLTEXT搜索处于布尔模式。我根本不需要在任何一行上执行此操作。我只需要一个从少于3个字符的单词中删除字符串的函数。该函数将在存储过程中使用,然后该存储过程将在已修改的字符串值

上搜索行

我的sql编程技巧不如.Net,我已经搜索了2天的功能,可以为我做这件事而没有运气。

我很抱歉,但到目前为止我甚至没有任何代码可以开始,有没有其他人知道如何继续或攻击这个问题?由于动态sql不允许存储函数或触发器完全卡住!

提前致谢!

1 个答案:

答案 0 :(得分:2)

假设只有空格分隔单词,您可以使用以下内容: -

SELECT SomeId, GROUP_CONCAT(SomeWord ORDER BY aNum SEPARATOR " ")
FROM (SELECT SomeId, SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(" ", SomeText, " "), " ", aNum), " ", -1) AS SomeWord, aNum, item_title_default
FROM SomeTable
CROSS JOIN (SELECT 1 + a.I + b.i * 10 + c.i * 100 AS aNum FROM integers a, integers b, integers c) SubInt
WHERE aNum <= (LENGTH(SomeText) - LENGTH(REPLACE(SomeText, " ", "")) + 2)
AND LENGTH(SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT(" ", SomeText, " "), " ", aNum), " ", -1)) > 3
ORDER BY SomeId, aNum) Sub1
GROUP BY SomeId

这依赖于一个整数表,其中一列名为i,行的值为0到9.它最多可处理1000个单词,但很容易扩展。

编辑 - 好的,这是一个MySQL存储过程,用于拆分字符串并删除3个或更少字符长的任何字。再次只拆分空格。

DELIMITER //

CREATE FUNCTION `func_Remove_ShortStrings`(InStr LONGTEXT) RETURNS LONGTEXT
    DETERMINISTIC
BEGIN

    DECLARE RetStr LONGTEXT DEFAULT "";
    DECLARE TempStr LONGTEXT DEFAULT "";
    DECLARE aWord LONGTEXT DEFAULT "";
    DECLARE WordLength INT DEFAULT 0;
    SET TempStr = TRIM(InStr);
    WHILE (LENGTH(TempStr) > 0) DO
        SET aWord = SUBSTRING_INDEX(TempStr, " ", 1);
        SET WordLength = LENGTH(aWord);
        IF (WordLength > 3) THEN
            SET RetStr = CONCAT(RetStr, " ", aWord);
        END IF;
        SET TempStr = TRIM(SUBSTRING(TempStr, WordLength + 1));
    END WHILE;

    return TRIM(RetStr);
END