在做一个文本框自动完成的小插件时, 发现一个问题:
如想搜索叫“林”某某的人, 输入“林”时, 出来的列表, 不是以“林”开头, 而是“陈X林”, 郁闷……闲暇时想了下修改的方法:
--0. 准备数据
DECLARE @T TABLE (T_Id VARCHAR(32), T_Name NVARCHAR(50))
INSERT INTO @T
SELECT REPLACE(NEWID(), '-', ''),'陈小林' UNION ALL
SELECT REPLACE(NEWID(), '-', ''),'包飞林' UNION ALL
SELECT REPLACE(NEWID(), '-', ''),'林冲' UNION ALL
SELECT REPLACE(NEWID(), '-', ''),'刘华' UNION ALL
SELECT REPLACE(NEWID(), '-', ''),'史大奈'
--搜索参数定义
DECLARE @Input NVARCHAR(20)
SET @Input = N'林'
--1. 普通情况
SELECT *
FROM @T
WHERE T_name LIKE '%'+@Input+'%'
ORDER BY
T_Name ASC
/*
C6445FF9657744B2B29D94F981FBFC4D 包飞林
B0D9A541F23048B8B3FE07C0A4641D50 陈小林
F84341EF5E2545B5B854B92A6FC6D6BE 林冲
*/
--2. 将匹配项在前的优先
SELECT *
FROM @T
WHERE T_name LIKE '%'+@Input+'%'
ORDER BY
CASE
WHEN SUBSTRING(T_Name, 1, LEN(@Input)) = @Input THEN 1
ELSE 0
END DESC,
T_Name ASC
/*
F84341EF5E2545B5B854B92A6FC6D6BE 林冲
C6445FF9657744B2B29D94F981FBFC4D 包飞林
B0D9A541F23048B8B3FE07C0A4641D50 陈小林
*/
--3. 将匹配项在前的优先, 简化版
SELECT *
FROM @T
WHERE T_name LIKE '%'+@Input+'%'
ORDER BY
CHARINDEX(@Input,T_Name) ASC,
T_Name ASC
/*
F84341EF5E2545B5B854B92A6FC6D6BE 林冲
C6445FF9657744B2B29D94F981FBFC4D 包飞林
B0D9A541F23048B8B3FE07C0A4641D50 陈小林
*/