我们经常需要使用拼音首字母来检索数据库,特别是应用于医院、商店等行业软件中。譬如搜索“zgr”就可以搜索所有包含“中国人”的记录。那么如果来实现才能即高效又方便呢?
方法一:先查询出所有记录,然后在逻辑层转化为拼音首字母后查询,显然傻瓜才会这么做。
方法二:在需要搜索的表中添加一个字段用于存放被检索字段内容对应的拼音,在搜索的时候同时去查询这两个字段,这种方法可行,但会增加数据库存放的大小。
方法三:在数据库中建立一个函数,在执行查询语句时通过此函数来转化搜索,函数如下:
代码SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: xoyozo
-- Create date: 2010-4-17
-- Description: 提供中文首字母
-- =============================================
CREATE FUNCTION fun_getPY
(
@str NVARCHAR ( 4000 )
)
RETURNS NVARCHAR ( 4000 )
AS
BEGIN
DECLARE @word NCHAR ( 1 ), @PY NVARCHAR ( 4000 )
SET @PY = ''
WHILE len ( @str ) > 0
BEGIN
SET @word =left ( @str , 1 )
SET @PY = @PY + ( CASE WHEN unicode ( @word ) BETWEEN 19968 AND 19968 + 20901
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
使用方法:
select * from 表 where fun_getPY(字段) like N ' %zgr% '
此方法是最快捷方便的,通过测试在文章表中搜索标题首字母,其耗时大约为不使用此函数搜索的 3 倍,相信部署在小数据量的项目中的成本是非常低的。
LINQ 方式操作
初学 LINQ 的朋友或许对 .dbml 文件不是很熟悉,数据库中的表可以直接拖动到 .dbml 的左侧,而存储过程、函数等可以直接拖到其右侧,然后就可以直接在逻辑使用了,下面是例子:
DataClasses1DataContext db = new DataClasses1DataContext();
var q = from d in db.Documents
where d.Title.Contains( " zgr " ) || db.fun_getPY(d.Title).Contains( " zgr " )
select d;
原文地址:http://xoyozo.me/blog/sql-by-chinese-spell.html