2010-11-30 119 views
1

我目前正在進行查詢以搜索特定的表。要求說我需要抓取所有記錄中的任何一組字段是like的輸入值。因此,我有一個類似於SQL搜索查詢

的查詢
SELECT * FROM MyTable 
WHERE Col1 like @input 
    or Col2 like @input 
    or Col3 like @input 

where子句中可能有任意數量的列。一個特定的客戶將有50列。因此,這個條款將會相當昂貴。

是否有另一種語法或方法可以使用,以便我可以說「輸入值是否存在於任何x列中?」

你會不同地寫查詢嗎?

+0

什麼數據庫平臺? MS SQL服務器,MySql,別的東西? – JohnFx 2010-11-30 20:41:19

+0

我們正在使用MSSQL – 2010-11-30 20:43:15

回答

3

取決於允許使用哪個通配符和哪些通配符,這些查詢的確可能會很昂貴,因爲優化程序在使用其中的許多索引來加速它們時會遇到困難。

如果您在MS SQL Server上運行此功能,則可以考慮使用全文搜索功能和CONTAINS關鍵字來實現此功能。

SELECT * 
FROM MyTable 
WHERE CONTAINS 
((col1,col2,col3) ,@input) 

或者搜索所有的文本索引列

SELECT * 
FROM MyTable 
WHERE CONTAINS 
(* ,@input) 
1

我會構造不同的數據。這50列的類型會不會一樣?既然你使用「like」,我會假設他們都是varchar列。爲什麼不能有3個表,'MyTable',一個包含字符串數據的表(不管它是什麼),以及一個包含兩個引用的連接表。

在這一點上,您的查詢就會變成:

select mt.* 
from MyTable mt 
    inner join JoinTable jt 
     on jt.MyTableId = mt.Id 
    inner join DataTable dt 
     on dt.Id = jt.DataTableId 
where dt.Data like @Input 

顯然,在如此,我們看到很多是簡單地說,答案的「你的數據結構錯重做吧。」這並不總是最有幫助的。如果由於某種原因(數據庫結構的官僚作風,對這種結構的傳統依賴關係等)你不能重構它,你需要意識到你正在旋轉這些列。在這一點上,你需要看看這個選項,這將根據這個數據庫的分析/事務(讀/寫)的方式而有所不同。如果你閱讀起來很沉重,你可以將數據複製到每次更新'MyTable'時更新的數據透視表中。如果你更具事務性,一個函數或視圖至少會抽象出這個樞軸結構,但是查詢會很昂貴。 MS SQL全文搜索功能的工作方式與複製數據和插入更新類似,取決於「類似」查詢的性質,讀取速度可能更快。

0

如果您不需要實時數據,你可以選擇一個數據倉庫中的情景。

  • 每天,刪除並重新加載僅含有一個ID和值列
  • 使用SELECT到表等
SELECT ID, Col1 FROM MyTable 
    UNION ALL SELECT ID, Col2 FROM MyTable 
    UNION ALL SELECT ID, Col3 FROM MyTable 
  • 指數從前面表回來,從左到右,...

這使您可以簡化您的原始選擇和您使用性能保持看齊

SELECT mt.* 
FROM MyTable mt 
     INNER JOIN MyDWTable mdwt ON mdwt.ID = mt.ID 
WHERE mdwt.Value LIKE @Input