2013-06-19 67 views
0

說我有如下表行:搜索跨越disperate領域,包含特定字符串

CREATE TABLE #Pig 
(
PigName VARCHAR(10), 
Field1 VARCHAR(10), 
Field2 VARCHAR(10), 
Field3 VARCHAR(10), 
Field4 VARCHAR(10), 
Field5 VARCHAR(10), 
Field6 VARCHAR(10), 
Field7 VARCHAR(10), 
Field8 VARCHAR(10), 
Field9 VARCHAR(10), 
Field10 VARCHAR(10), 
Field11 VARCHAR(10) 
) 

如果我是來搜索#Pig的所有行字符串「例如」在任何的列我必須使用以下腳本還是有更緊湊的方法來處理 - 也許通過TVP

SELECT * 
FROM #Pig 
WHERE Field1 LIKE '%eg%' OR 
     Field2 LIKE '%eg%' OR 
     Field3 LIKE '%eg%' OR 
     Field4 LIKE '%eg%' OR 
     Field5 LIKE '%eg%' OR 
     Field6 LIKE '%eg%' OR 
     Field7 LIKE '%eg%' OR 
     Field8 LIKE '%eg%' OR 
     Field9 LIKE '%eg%' OR 
     Field10 LIKE '%eg%' OR 
     Field11 LIKE '%eg%' 

每個字段具有相同的數據類型,但它們實際上並沒有連接....所以歸一化數據是不是一個解決方案。

回答

0

更緊湊的方式(和更明智的方式)來接近它將存儲豬的名稱不同。

pig_num pig_name 
-- 
1  Wilbur 
2  Peggy 
3  Ominous 
4  Portents 

然後,你可以只寫

select * 
from pigs 
where pig_name like '%eg%' 

CREATE TABLE語句爲表可能這個樣子。

create table pigs (
    pig_num integer primary key, 
    pig_name varchar(20) not null unique 
); 
+0

AKK第一範式... – gbn

+0

OK - 對不起 - 我需要編輯OP讓事情更清晰一點 - 我使用的命名約定只是爲了讓事情變得更容易寫 – whytheq

1

您是否確實需要搜索任意子字符串或單詞搜索工作?如果是這樣,全文搜索可能是一個很好的答案。

CREATE TABLE dbo.Pig 
(
    ID INT IDENTITY CONSTRAINT PK_Pig PRIMARY KEY CLUSTERED, 
    PigName VARCHAR(10), 
    Field1 VARCHAR(10), 
    Field2 VARCHAR(10), 
    Field3 VARCHAR(10), 
    Field4 VARCHAR(10), 
    Field5 VARCHAR(10), 
    Field6 VARCHAR(10), 
    Field7 VARCHAR(10), 
    Field8 VARCHAR(10), 
    Field9 VARCHAR(10), 
    Field10 VARCHAR(10), 
    Field11 VARCHAR(10) 
) 
GO 

CREATE FULLTEXT CATALOG mycatalog; 
GO 

CREATE FULLTEXT INDEX ON dbo.Pig 
( 
    Field1 LANGUAGE 1033, 
    Field2 LANGUAGE 1033, 
    Field3 LANGUAGE 1033, 
    Field4 LANGUAGE 1033, 
    Field5 LANGUAGE 1033, 
    Field6 LANGUAGE 1033, 
    Field7 LANGUAGE 1033, 
    Field8 LANGUAGE 1033, 
    Field9 LANGUAGE 1033, 
    Field10 LANGUAGE 1033, 
    Field11 LANGUAGE 1033 
) 
KEY INDEX PK_Pig ON mycatalog; 
GO 

SELECT * 
FROM dbo.Pig 
WHERE CONTAINS(*, '"peg*"') -- will find peg, peggy, but not jpeg. 

雖然FTS不能搜索任意的子字符串,但它可以搜索字詞前綴(上面的例子)並且具有其他強大的功能。見http://msdn.microsoft.com/en-us/library/ms142583.aspx#supported

全文搜索:http://msdn.microsoft.com/en-us/library/ms142583.aspx

+0

+1看起來像一個有趣的方法 - 我以前沒有使用過這些工具。 – whytheq