Sql 在分散字段中搜索包含特定字符串的行

Sql 在分散字段中搜索包含特定字符串的行,sql,sql-server-2012,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),

假设我有下表:

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%'
注意每个字段都是相同的数据类型,但它们实际上没有连接……因此数据的正常化不是一个解决方案

一种更紧凑的方法(也是更明智的方法)是以不同的方式存储猪名

pig_num  pig_name
--
1        Wilbur
2        Peggy
3        Ominous
4        Portents
那你就可以写了

select *
from pigs
where pig_name like '%eg%'
该表的CREATETABLE语句可能如下所示

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

你真的需要搜索任意的子字符串吗?或者一个单词搜索可以吗?如果是这样,全文搜索可能是一个很好的答案

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不能搜索任意子字符串,但它可以搜索单词前缀(上面的例子),并具有其他强大的功能。看


全文搜索:

好的-抱歉-我需要编辑OP以使事情更清楚-我使用的命名约定只是为了让事情更容易编写+1看起来是一种有趣的方法-我以前从未使用过这些工具。