0

假设我有下表:

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 中字符串“eg”在任何列中的所有行,我是否必须使用以下脚本,或者是否有更紧凑的方法来解决这个问题 - 也许通过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%'

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

4

2 回答 2

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

于 2013-06-24T00:26:00.800 回答
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
);
于 2013-06-19T14:22:58.300 回答