2013-04-22 108 views
0

我遇到問題。Mysql函數刪除少於3個字符的字

在我的數據庫中,我有某些存儲過程執行關鍵字搜索。在我的GUI(在asp.net中)我有一個功能,照顧我的問題,但我需要在MySQL中相同的功能。

我需要從小於3個字符的任何單詞中去掉一個字符串,並且只保留更多的單詞。例如,「阿姆斯特丹的酒店」將返回「阿姆斯特丹酒店」。

編輯:這些字段在innodb全文中,因此我需要實際刪除所有小於3的單詞,因爲我的存儲過程將所有「」替換爲「+」。 FULLTEXT搜索處於布爾模式。我不需要在任何行上執行此操作。我只需要一個從少於3個字符的單詞中去除字符串的函數。該功能將在存儲過程中使用,則該存儲過程將在行搜索的修改後的字符串值

我的SQL編程技能不如在.Net和香港專業教育學院一直在尋找2天爲一個功能可以爲我做這件事沒有運氣。

很抱歉,我甚至沒有任何代碼到目前爲止,沒有任何其他人有關於如何繼續或攻擊這個問題的想法?由於動態SQL不允許在存儲函數或觸發器完全卡住!

在此先感謝!

+0

也許你根本不需要這些功能?也許全文索引就是你要找的東西?像「in」這樣的短語會被自動忽略。 – fancyPants 2013-04-22 09:18:58

+0

字符串有多複雜?如果這些單詞總是用空格分隔,那麼它不會太糟糕,但它需要應對逗號,句號等,然後它變得更加複雜。 – Kickstart 2013-04-22 09:27:53

+0

我有一個全文索引。最小單詞是3.「in」在停止列表中,但是如果我搜索「+ hotels + in + amsterdam」,它不顯示任何結果,即使我有確切的關鍵字。 – 2013-04-22 09:50:47

回答

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 

這依賴於整數的表稱爲單列我,用行與值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 
+0

謝謝,但它不是什麼即時通訊尋找,我需要函數採取一個字符串作爲參數,並返回一個新的字符串與單詞少於3個字符從字符串中刪除。林不知道如何將其轉換成該? – 2013-04-22 10:37:40

+0

您是否在進行搜索時對所有行或每行進行此操作?如果事先您可以使用基於上述內容的東西來填充額外的列。如果你在每一次搜索的每一行都做了這個,那麼我預計性能會很差。 – Kickstart 2013-04-22 10:51:23

+0

我不需要在任何行上執行此操作。我只需要一個從少於3個字符的單詞中去除字符串的函數。該函數將用於存儲過程,然後該存儲過程將在修改的字符串值上的行上搜索 – 2013-04-22 10:58:54