2013-06-19 49 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