0

我有个问题。

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

我需要从任何少于 3 个字符的单词中删除一个字符串,并且只保留包含更多字符的单词。例如,“hotels in amsterdam”将返回“hotels amsterdam”。

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

我的 sql 编程技能不如 .Net 中的那么好,我一直在寻找 2 天来寻找一个可以为我做到这一点但没有运气的函数。

对不起,但到目前为止我什至没有任何代码来开始工作,还有其他人知道如何继续或解决这个问题吗?由于存储函数中不允许使用动态 sql 或触发器我完全卡住了!

提前致谢!

4

1 回答 1

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
于 2013-04-22T09:58:21.790 回答