在資料庫中實作中文模糊搜尋時,直接使用 LIKE '%關鍵字%' 無法針對拼音首字母進行查詢。常見解決方案有三種:
利用 Unicode 範圍(19968~40869)判斷漢字,並對照內建對應表取得首字母:
CREATE FUNCTION dbo.fn_GetFirstLetterPy
(
@str NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @word NCHAR(1), @py NVARCHAR(4000) = '';
WHILE LEN(@str) > 0
BEGIN
SET @word = LEFT(@str, 1);
SET @py = @py +
(CASE
WHEN UNICODE(@word) BETWEEN 19968 AND 40869
THEN (SELECT TOP 1 PY FROM (
SELECT 'A' AS PY, N'驁' AS word UNION ALL SELECT 'B', N'簿' UNION ALL SELECT 'C', N'錯'
UNION ALL SELECT 'D', N'鵽' UNION ALL SELECT 'E', N'樲' UNION ALL SELECT 'F', N'鰒'
UNION ALL SELECT 'G', N'腂' UNION ALL SELECT 'H', N'夻' UNION ALL SELECT 'J', N'攈'
UNION ALL SELECT 'K', N'穒' UNION ALL SELECT 'L', N'鱳' UNION ALL SELECT 'M', N'旀'
UNION ALL SELECT 'N', N'桛' UNION ALL SELECT 'O', N'漚' UNION ALL SELECT 'P', N'曝'
UNION ALL SELECT 'Q', N'囕' UNION ALL SELECT 'R', N'鶸' UNION ALL SELECT 'S', N'蜶'
UNION ALL SELECT 'T', N'籜' UNION ALL SELECT 'W', N'鶩' UNION ALL SELECT 'X', N'鑂'
UNION ALL SELECT 'Y', N'韻' UNION ALL SELECT 'Z', N'咗'
) T WHERE word >= @word COLLATE Chinese_PRC_CS_AS_KS_WS ORDER BY PY ASC)
ELSE @word
END);
SET @str = RIGHT(@str, LEN(@str) - 1);
END
RETURN @py;
END
-- 搜尋標題拼音首字母包含 "zgr" 的文章
SELECT * FROM Articles WHERE dbo.fn_GetFirstLetterPy(Title) LIKE N'%zgr%';
.dbml 設計介面中,將資料表拖至左側,將此函數拖至右側(方法窗格)。using (var db = new DataClasses1DataContext())
{
var q = from d in db.Documents
where d.Title.Contains("zgr") || db.fn_GetFirstLetterPy(d.Title).Contains("zgr")
select d;
// 執行查詢...
}