首页 > 解决方案 > TSQL多列上的多个搜索条件

问题描述

使用 SQL Server 2012。

在我们的网页上,我们有多个文本框。用户可以输入一个并单击搜索或输入几个文本框并单击搜索...

示例 T-SQL:

WHERE FirstName = @FirstName 

如果@firstname未在文本框中输入,那么我不希望它成为where子句的一部分

  AND LastName = @LastName

此处相同:如果未在文本框中输入姓氏,则我不希望将其包含在where子句中

... 等等

问题:所有这些表都包含超过一百万行,因此由于性能影响,我不能在 where 子句中使用 case 语句

那么我可以采取任何其他方法来解决这个问题吗?

标签: sqlsql-servertsql

解决方案


您可以使用全文搜索获得相同的结果。那么您也不必创建动态采石场。由于它使用不同的服务,搜索速度非常快。

首先,您必须创建一个 FullTextCatalog,然后向其中添加表和列(https://docs.microsoft.com/en-us/sql/relational-databases/search/full-text-search?view=sql-server-版本 15 )

我使用 AdventureWorks db 编写了一个演示。您可以根据您的表格和列转换此代码。我刚刚在这里添加了 3 列,您可以将所有列添加到全文中。

USE [AdventureWorks2016]
GO

/****** Object:  FullTextCatalog [SearchEmp]    Script Date: 6/24/2020 8:11:33 AM ******/
CREATE FULLTEXT CATALOG [SearchEmp] WITH ACCENT_SENSITIVITY = ON
GO

**strong text**
CREATE FULLTEXT INDEX ON [Person].[Person](
[FirstName] LANGUAGE 'English', 
[LastName] LANGUAGE 'English', 
[MiddleName] LANGUAGE 'English')
KEY INDEX [PK_Person_BusinessEntityID]ON ([SearchEmp], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)



  GO

Declare @FirstName Nvarchar(200)='KEN'
Declare @LastName  nvarchar(200)='Sánchez'
Declare @Searchtext nvarchar(400)

-- build search text avoid spaces and special characters in words
SET @Searchtext= concat(TRIM(@FirstName),' OR ', TRIM(@LastName)) 

--- First and Last Name
select top 3 * from [Person].[Person]
where Contains((FirstName,LastName),@Searchtext)

--First Name
SET @Searchtext=@FirstName
select top 3 * from [Person].[Person]
where Contains((FirstName,LastName),@Searchtext)

--Last Name
SET @Searchtext=@LastName
select  top 3* from [Person].[Person]
where Contains((FirstName,LastName),@Searchtext)

-- use ContainsTable
SET @Searchtext=@LastName
select top 3 * from ContainsTable([Person].[Person],(FirstName,LastName),@Searchtext) CT
Inner join [Person].[Person] P ON CT.[Key] = P.BusinessEntityID

在此处输入图像描述

您可以使用权重对结果进行排序(SQL Server 加权全文搜索


推荐阅读