2014-06-26 53 views
1

我正在SQL Server 2008中工作。我試圖返回所有記錄,其中給定的列有一個匹配至少一個非常大的令牌的子字符串一組令牌。我正在搜索的列數也很大。做這個的最好方式是什麼?在一大列的列中搜索一大組令牌

我知道的基本方法是一樣的東西:

WHERE 
    (col1 LIKE '%token1%' OR col1 LIKE '%token2%' OR... 
    OR 
    col2 LIKE '%token1%' OR col1 LIKE '%token2%' OR... 
    OR 
    . . . . 
    ) 

然而,這將是非常乏味和大的。

+0

我想知道是否會幫助將所有列附加在一起,並搜索該字符串,而不是每個單獨的列。 – Beth

+0

是的,我可以確定連接列(用分隔符分隔)。但是,我仍然遇到搜索許多令牌的問題。 – user3100444

+0

你可以把所有的標記(STREET,DRIVE,AVENUE)放在一個表中,每行有一個標記,然後遍歷這些行以找出匹配?不完全確定你在做什麼,你想用標準縮寫代替標記嗎? – Beth

回答

2

這是有點長的評論。

你基本上有兩種選擇。首先是全文搜索。也就是說,將每列作爲文檔對待,並在其上創建全文索引。

第二個選項是規範化你的數據結構。您將爲每列中的每個標記創建一個單獨的行。在此規範化結構中的一行將如下所示:

EntityId  "Column"  Token 
    1   col1  Toke1 
    1   col3  Toke2 
    2   col1  Toke2 
. . . 

此結構將大大加快您的搜索並使用適當的索引。

順便說一下,你的數據結構看起來很可疑。包含列中事物列表的表通常是一個糟糕的主意。關係數據庫中列表的正確數據結構是一個表格,而不是一列。包含相同類型信息(例如令牌列表)的多列的表通常表明列應該是非規範化的。

+0

其實,我的表格包含客戶地址。大多數情況下,這些數據都是標準化的,因爲街道信息總是位於街道列中,國家/地區值始終位於國家/地區列中等。但是,可能存在街道信息(例如國家/地區欄)中的記錄。所以,我必須將每列視爲可以容納任何數據元素(這就是爲什麼我需要搜索所有列)。我試圖確定某些標記不是縮寫的。例如,我需要確定'STREET'被用來代替'ST'。有很多令牌我需要搜索。 – user3100444

+0

@ user3100444。 。 。這聽起來像你需要花幾天清理數據。讓「街道」有時在「國家」欄中是危險的。 –

+0

對。但是,我不控制輸入到此表中的內容。我只是試圖確定使用完整的單詞而不是縮寫。 – user3100444