中文模糊查詢常需按拼音首字母檢索。通過內嵌拼音區間映射表的標量函數實現單字首字母提取,再疊加成字符串首字母串。
CREATE FUNCTION dbo.f_GetPy(@Str NVARCHAR(400))
RETURNS NVARCHAR(4000)
AS BEGIN
DECLARE @Len INT, @Result NVARCHAR(4000)
DECLARE @Map TABLE (Ch NCHAR(1) COLLATE Chinese_PRC_CI_AS, Letter NCHAR(1))
INSERT @Map VALUES
('吖','A'),('八','B'),('嚓','C'),('咑','D'),('妸','E'),('發','F'),
('旮','G'),('铪','H'),('丌','J'),('咔','K'),('垃','L'),('嘸','M'),
('拏','N'),('噢','O'),('妑','P'),('七','Q'),('呥','R'),('仨','S'),
('他','T'),('屲','W'),('夕','X'),('丫','Y'),('帀','Z')
SELECT @Len = LEN(@Str), @Result = ''
WHILE @Len > 0
BEGIN
SELECT TOP 1 @Result = Letter + @Result, @Len = @Len - 1
FROM @Map WHERE Ch <= SUBSTRING(@Str, @Len, 1)
ORDER BY Ch DESC
IF @@ROWCOUNT = 0
SELECT @Result = SUBSTRING(@Str, @Len, 1) + @Result, @Len = @Len - 1
END
RETURN @Result
END
SELECT dbo.f_GetPy(N'東莞市') -- DGX
SELECT dbo.f_GetPy(N'ab中c國人') -- abZGcR
-- 查詢首字母匹配
SELECT * FROM Customers WHERE dbo.f_GetPy(CompanyName) = 'ZGYH'
PyInitials AS dbo.f_GetPy(Name) PERSISTED + 索引COLLATE Chinese_PRC_CI_AS 確保中文字符按拼音順序排列,映射表才生效。不同排序規則下字符順序不同,映射表需重建。