对于包含特定字符串的行,在不同的字段中搜索

时间:2013-06-19 14:13:48

标签: sql sql-server-2012

说我有下表:

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%'

注意每个字段都是相同的数据类型,但它们实际上并未连接....因此规范化数据并不是一个解决方案。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
);