SQL替换问题(求效率高的算法)

iloveyoujia 2013-11-19 07:46:59
加精
有一个字典表:

A B
中 Middle
中国 China
中国人 Chinese
爱 Love
国 country
在 In
家 Home

我有一个字符“中国人爱国” ->替换成 “Chinese_love_Country

现在方式是,先按照A的最大长度排序,然后一条一条循环替换,不管能不能匹配到,都替换(直到替换有部分成功),然后继续按照A的长度派讯,继续替换,直到替换到没有中文为止,或者查找完数据。
这个算法,耗费了6个小时。能不能有快点的算法。

算法大概是:
while exists(select * from 表)
BEGIN
select top 1 @name=A,@Enname =B from 表 order by len(A) desc
select @KeyWords= 'Replace('+@KEY+','''+@name+''','''+convert(varchar,B)+'_'')'
From @T where A=@name
SET @KeyWords='select @Valuet='+@KeyWords+''
exec sp_executesql @KeyWords,N'@Valuet Nvarchar(2000) output',@out output
IF patindex('%[吖-座]%',''''+@out+'''')>0 --包含中文
BEGIN
SELECT @KEY=''''+@out+''''

SET @Enname=''
SET @KeyWords=''
delete @T where A=@name
END
IF patindex('%[吖-座]%',''''+@out+'''')=0
BEGIN
SET @return=replace(@out,'''','')
BREAK;
END
set @return=@out
END

select @return
END

如果有效率高的SQL后,补加500分。谢谢。
...全文
2472 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
jorkin_me 2014-02-07
  • 打赏
  • 举报
回复
我觉得数据库里没有的词也不应该扔掉。

SET NOCOUNT ON
GO

USE TEMPDB
GO

IF Object_id('t_dic') IS NOT NULL
  DROP TABLE t_dic
GO

CREATE TABLE t_dic
  (
     a VARCHAR(MAX),
     b VARCHAR(MAX)
  )

INSERT INTO t_dic
SELECT '中',
       'Middle'
UNION ALL
SELECT '中国',
       'China'
UNION ALL
SELECT '中国人',
       'Chinese'
UNION ALL
SELECT '爱',
       'Love'
UNION ALL
SELECT '国',
       'country'
UNION ALL
SELECT '在',
       'In'
UNION ALL
SELECT '家',
       'Home'
GO

DECLARE @STR        VARCHAR(MAX),
        @I          INT,
        @STR_RESULT VARCHAR(MAX),
        @STR_TMP    VARCHAR(MAX)

SELECT @STR = '中国人傻爱中国傻家中国'

WHILE Len(@STR) > 1
  BEGIN
      SET @STR_TMP = Substring(@STR, 1, 1)
      SELECT TOP 1 @STR_RESULT = Isnull(@STR_RESULT + '_', '') + b,
                   @I = Len(a)
      FROM   t_dic
      WHERE  @STR LIKE a + '%'
      ORDER  BY Len(a) DESC
      IF @@ROWCOUNT = 0
        BEGIN
            SET @I = 1
            SET @STR_RESULT = @STR_RESULT + '_' + @STR_TMP
        END
      SET @STR = Stuff(@STR, 1, @I, '')
  END
SELECT @STR_RESULT

/**********************************
Chinese_傻_Love_China_傻_Home_China
**********************************/
zhang0804140227 2013-11-26
  • 打赏
  • 举报
回复
TSQL实现比较麻烦,建议用前端程序实现分词,。。。。。。。
mr_wangb 2013-11-26
  • 打赏
  • 举报
回复
我都没有看懂..学习一下吧
cpeng123 2013-11-26
  • 打赏
  • 举报
回复
本来感冒有好转,思考你这个问题,脑运行超速,最后烧崩溃了。最终写下这行字,表示我有帮你想过。
her笨小孩 2013-11-24
  • 打赏
  • 举报
回复
我不会,但是震惊了
  • 打赏
  • 举报
回复
select 'Chinese_love_Country'
a_jian 2013-11-22
  • 打赏
  • 举报
回复
太复杂了点!用程序吧
喂喂喂001 2013-11-22
  • 打赏
  • 举报
回复
学习,sql函数很好,常来看看
小妹加个钟 2013-11-21
  • 打赏
  • 举报
回复
学习学习大开眼界了
  • 打赏
  • 举报
回复
引用 26 楼 SQL 的回复:
借用一下数据 SET NOCOUNT ON GO USE TEMPDB GO IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB GO CREATE TABLE TB ( COL1 VARCHAR(MAX) , COL2 VARCHAR(MAX) ) INSERT INTO TB SELECT '中' , 'Middle' UNION ALL SELECT '中国' , 'China' UNION ALL SELECT '中国人' , 'Chinese' UNION ALL SELECT '爱' , 'Love' UNION ALL SELECT '国' , 'country' UNION ALL SELECT '在' , 'In' UNION ALL SELECT '家' , 'Home' GO DECLARE @STR VARCHAR(MAX) , @I INT , @STR_RESULT VARCHAR(MAX) SELECT @STR = '中国人傻爱中国傻家中国' WHILE LEN(@STR) > 1 BEGIN SELECT TOP 1 @STR_RESULT = ISNULL(@STR_RESULT + '_' , '') + COL2 , @I = LEN(COL1) FROM TB WHERE @STR LIKE COL1 + '%' ORDER BY LEN(COL1) DESC IF @@ROWCOUNT = 0 SET @I = 1 SET @STR = STUFF(@STR , 1 , @I , '') END SELECT @STR_RESULT /* Chinese_Love_China_Home_China */
难道我写的不高效,伤不起的楼主啊
nanjiahe 2013-11-21
  • 打赏
  • 举报
回复
rover11 2013-11-21
  • 打赏
  • 举报
回复
加条数据 国人爱国 对应 aaa-bbb-ccc 似乎就不对了
tonny12345 2013-11-21
  • 打赏
  • 举报
回复
搞的这么复杂,用游标。
beyondcj 2013-11-20
  • 打赏
  • 举报
回复
lebao82 2013-11-20
  • 打赏
  • 举报
回复
不用这么复杂吧,假设: str = “中国人爱”, 1、查询字典表中A列中是否有字符串str;如“中国人爱”; 2、没有,str去掉最右边的一个汉字,继续1,直到查到结果,然后替换掉这部分;如去掉“中国人爱”的“爱”,就查到“中国人”了。 3、去掉字符串中已查到的那部分,其余部分继续前两步。
一枚小菜 2013-11-20
  • 打赏
  • 举报
回复
不错,学习!
leeya66 2013-11-20
  • 打赏
  • 举报
回复
为什么用SQL去做这个事情?
bancxc 2013-11-19
  • 打赏
  • 举报
回复
ding asdfadsfasdfasdf
--小F-- 2013-11-19
  • 打赏
  • 举报
回复
恩 继续发言吧。
guguda2008 2013-11-19
  • 打赏
  • 举报
回复
试试我这个,在COL1上建索引后运行
SET NOCOUNT ON
GO
USE TEMPDB
GO
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(
COL1 VARCHAR(MAX)
,COL2 VARCHAR(MAX)
)
INSERT INTO TB 
select '中','Middle' union all
select '中国','China' union all
select '中国人','Chinese' union all
select '爱','Love' union all
select '国','country' union all
select '在','In' union all
select '家','Home'
GO
DECLARE @STR VARCHAR(MAX),@I INT ,@STR_RESULT VARCHAR(MAX)
SELECT @STR='中国人傻爱中国傻家中国',@STR_RESULT=''
,@I=1
WHILE @I<=LEN(@STR)
BEGIN
	IF EXISTS(SELECT 1 FROM TB WHERE COL1 LIKE SUBSTRING(@STR,@I,1)+'%' AND @I+LEN(COL1)<=LEN(@STR)+1 AND STUFF(@STR,1,@I-1,'') LIKE COL1+'%')
	BEGIN
		SELECT TOP 1 @STR_RESULT=@STR_RESULT+COL2+'_',@I=@I+LEN(COL1)
		FROM TB
		WHERE COL1 LIKE SUBSTRING(@STR,@I,1)+'%' AND @I+LEN(COL1)<=LEN(@STR)+1 AND STUFF(@STR,1,@I-1,'') LIKE COL1+'%'
		ORDER BY LEN(COL1) DESC
	END
	ELSE
	BEGIN
		SELECT @STR_RESULT=@STR_RESULT+SUBSTRING(@STR,@I,1)
		SET @I=@I+1
	END
END

IF @STR_RESULT LIKE '%[_]' SET @STR_RESULT=LEFT(@STR_RESULT,LEN(@STR_RESULT)-1)
SELECT @STR_RESULT
--Chinese_傻Love_China_傻Home_China
加载更多回复(23)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧