正如其他人所说 - 全文搜索可能是这类事情的最佳解决方案。也就是说,我认为提供T-SQL解决方案会很有趣。
快速免责声明1
*我强烈建议您不要使用以下解决方案 - 这是旨在成为一个有趣的小SQL锻炼;表现会很糟糕。而且 - 我演示了两个非常有效的方式来分割字符串:一个使用PARSENAME *
快速免责声明2
使用杰夫MODEN的DelimitedSplit8K,其他的技术我应该链接该列插入指出一个问题作为一对夫妇建议的单个字符串 - 它可能导致误报;考虑下面的查询:
DECLARE @search varchar(100) = 'ab';
WITH sampleData AS (SELECT fn, ln FROM (VALUES ('aa', 'bb'), ('cc', 'dd')) t(fn,ln))
SELECT *
FROM sampleData
WHERE CONCAT(fn,ln) LIKE '%'[email protected]+'%';
上面的查询将返回即使“AB”并不在任一列中存在的第一个记录。出于这个原因,你会改变(在约翰的例子或CHARINDEX)在哪里找这样的:
WHERE CONCAT(fn, '|||', ln) LIKE '%'[email protected]+'%';
我的解决方案
-- SAMPLE DATA
-------------------------------------------------
DECLARE @employees TABLE
(
FirstName varchar(100),
LastName varchar(100),
Manager varchar(100),
Department varchar(100)
);
INSERT @employees
SELECT *
FROM
(
VALUES
('bob', '****', 'ddd', 'sss'),
('fff', 'fred', 'obx', 'ccc'),
('Sue', 'abcd', 'ddd', 'zzz'),
('ddd', 'dcba', '123', 'fobbb')
) xx(x1, x2, x3, x4);
-- Solution #1: when @search has <= 4 "items"
-------------------------------------------------
DECLARE @search varchar(100) = 'xx bb ff zz';
SELECT e.*
--,PARSENAME(REPLACE(@search,' ','.'), N) AS matchedPattern
FROM (VALUES (1),(2),(3),(4)) t(n)
CROSS JOIN @employees e
WHERE
CHARINDEX
(
PARSENAME(REPLACE(@search,' ','.'), N),
CONCAT(FirstName, '|||', LastName, '|||', Manager, '|||', Department)
) > 0;
-- Solution #2: when @search has (or can have) > 4 "items"
-------------------------------------------------
-- for this you will need delimitedsplit8k: http://www.sqlservercentral.com/articles/Tally+Table/72993/
SELECT e.*
FROM dbo.delimitedsplit8k(@search, ' ')
CROSS JOIN @employees e
WHERE
CHARINDEX
(
item,
CONCAT(FirstName, '|||', LastName, '|||', Manager, '|||', Department)
) > 0;
SQL Server有一个叫做全文搜索功能。可能你想在这里。 – Hogan
我在想“全文搜索”。 –
@GordonLinoff - 有3秒钟! :D – Hogan