首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 獲取漢字拼音首字母的標量函數實現

     編輯:關於SqlServer

中文模糊查詢常需按拼音首字母檢索。通過內嵌拼音區間映射表的標量函數實現單字首字母提取,再疊加成字符串首字母串。

函數代碼

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'

性能優化建議

  • 函數屬 RBAR(逐行處理),大表查詢會全表掃描,無法用索引
  • 方案 1:物化列 PyInitials AS dbo.f_GetPy(Name) PERSISTED + 索引
  • 方案 2:全文檢索 / 專用搜索引擎(Elasticsearch 等)
  • 方案 3:應用層預計算存儲首字母列

排序規則關鍵

COLLATE Chinese_PRC_CI_AS 確保中文字符按拼音順序排列,映射表才生效。不同排序規則下字符順序不同,映射表需重建。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved