sql - TSQL多列上的多个搜索条件
问题描述
使用 SQL Server 2012。
在我们的网页上,我们有多个文本框。用户可以输入一个并单击搜索或输入几个文本框并单击搜索...
- 名
- 姓
- 地址栏
- 员工代码
- 语言...(共7个文本框)
示例 T-SQL:
WHERE FirstName = @FirstName
如果@firstname
未在文本框中输入,那么我不希望它成为where
子句的一部分
AND LastName = @LastName
此处相同:如果未在文本框中输入姓氏,则我不希望将其包含在where
子句中
... 等等
问题:所有这些表都包含超过一百万行,因此由于性能影响,我不能在 where 子句中使用 case 语句
那么我可以采取任何其他方法来解决这个问题吗?
解决方案
您可以使用全文搜索获得相同的结果。那么您也不必创建动态采石场。由于它使用不同的服务,搜索速度非常快。
首先,您必须创建一个 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 加权全文搜索)
推荐阅读
- sql-server - SQL:将文件名作为值插入(使用 BULK INSERT)
- javascript - 将 keyup 方法绑定到两个 jQuery 对象
- c# - Visual Studio docker工具在调试时发布端口
- wcf - 如何使用 SOAP UI 工具测试 WCF wsHttpBinding 端点以及证书?
- bash - 在 CSV 文件中搜索第一列中的值,如果找到,将第二列的值向下移动一行
- prolog - 立即在控制台上写入
- swift - 应用内购买不更新沙盒下的所有订阅?
- java - 具有多个数据库服务器的分布式事务似乎不可靠
- python-3.x - 如何让输出一直问我直到满足条件?
- javascript - 如何在画布上绘制流畅的线条而不清除它?