正如其他人所說 - 全文搜索可能是這類事情的最佳解決方案。也就是說,我認爲提供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