有朋友需求一个问题,就是处理一张表中某一字段,从这个字段中去截取内容中最后一个中文词语。

ID	SourceText	Result
1 张达:U:1杨英苹:U:1,周忱:U:1,;苗桥:U:1,章玮:U:1,;
2 gaoying,高颖:U;
3 gaoying,高颖:U;
4 mq,苗桥;dingjian,丁健:U;zhangwei,章玮;zc,周忱;
5 xwj,向文杰;
6 dingjian,丁健;
7 mq;chendeyong;
8 gy,郭颖;
9 houwenjun,侯文君;lj,李军;sunle,孙乐;
10 dingjian,丁健:U;
11 dingjian,丁健:U;zhangwei,章玮;
12 wwm,王文明;zkl,张康亮;jiangyuan,蒋远;fyj,范云军;
13 dingjian,丁健;
14 fyj,范云军;wwm,王文明;zkl,张康亮;
15 lww,陆维巍;

Source Code

创建一个张来存储上面的数据:

SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[DataSource](
[ID] [int] IDENTITY(1,1) NOT NULL,
[SourceText] [nvarchar](100) NULL, --原始值
[Result] [nvarchar](100) NULL --处理结果
) ON [PRIMARY] GO

Source Code

另外,你还要创建另外一张表,用来存储所有字符串中,分隔符号:

SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO CREATE TABLE [dbo].[Punctuation](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](2) NULL
) ON [PRIMARY] GO

Source Code

把所有分隔的标点符号,添加入此表中:

处理数据,我们需要分好次来进行,先去除字母和数字:

得到的结果:

接下来,我们去除字符串的标点字符:

这一步,运行的结果如下:

越来越接近我们需求的结果了:
此时,我需要对处理的结果,再次处理,得需要了解下面二个函数:
使用XQuery的nodes()方法实现字符拆分http://www.cnblogs.com/insus/archive/2012/02/26/2368283.html

MS SQL Server字符拆分函数http://www.cnblogs.com/insus/p/3163564.html

其实二个函数,最终处理结果是一样的。就是分割字符串,然后放在一张表中

回到刚才的代码中,我们只管添加一行代码即可实现了我们的要求:

    DECLARE @r INT = 1,@rs INT = 0
SELECT @rs = MAX([ID]) FROM [dbo].[DataSource] WHILE @r <= @rs
BEGIN
DECLARE @Text NVARCHAR(100)
SELECT @Text = [SourceText] FROM [dbo].[DataSource] WHERE [ID] = @r  WHILE PATINDEX('%[A-Za-z0-9]%',@Text) > 0     
SET @Text = STUFF(@Text,PATINDEX('%[A-Za-z0-9]%',@Text),1,' ')   DECLARE @x INT = 1,@xs INT = 0
SELECT @xs = MAX([ID]) FROM [dbo].[Punctuation] WHILE @x <= @xs
BEGIN
DECLARE @p NVARCHAR(2)
SELECT @p = [Name] FROM [dbo].[Punctuation] WHERE [ID] = @x
SET @Text = RTRIM(LTRIM(REPLACE(@Text,@p,' ')))
SET @x = @x + 1
END SELECT TOP 1 @Text = [WORD] FROM [dbo].[udf_Split](@Text,' ') WHERE LEN(ISNULL([WORD],''))> 0 ORDER BY [ID] DESC UPDATE [dbo].[DataSource] SET [Result] = @Text WHERE [ID] = @r SET @r = @r + 1
END
GO

Source Code

结果如下:

OK,这就是实现的全部过程。但是,我们应该不满足上面的代码。既然都使用正则来去除字母,数字,那标点符号可以使用正则来去除对吧。
所以说,我们不必再创建一个表来存储标点符号了。

DECLARE @r INT = 1,@rs INT = 0
SELECT @rs = MAX([ID]) FROM [dbo].[DataSource] WHILE @r <= @rs
BEGIN
DECLARE @Text NVARCHAR(100)
SELECT @Text = [SourceText] FROM [dbo].[DataSource] WHERE [ID] = @r WHILE PATINDEX('%[A-Za-z0-9:,;]%',@Text) > 0     
         SET @Text = STUFF(@Text,PATINDEX('%[A-Za-z0-9:,;]%',@Text),1,' ') SET @Text = LTRIM(RTRIM(@Text)) SELECT TOP 1 @Text = [WORD] FROM [dbo].[udf_Split](@Text,' ') WHERE LEN(ISNULL([WORD],''))> 0 ORDER BY [ID] DESC UPDATE [dbo].[DataSource] SET [Result] = @Text WHERE [ID] = @r SET @r = @r + 1
END

Source Code

最终的结果一样,代码很了不少!!!

截取字符串中最后一个中文词语(MS SQL)的更多相关文章

  1. Java 正则判断一个字符串中是否包含中文

    使用正则判断一个字符串中是否包含中文或者中文字符 代码实现如下: import java.util.regex.Matcher; import java.util.regex.Pattern; /** ...

  2. [转]EXCEL截取字符串中某几位的函数——LeftMIDRight及Find函数的使用

    原文地址:http://blog.sina.com.cn/s/blog_3f136a180102ymq5.html EXCEL截取字符串中某几位的函数 ——Left MID Right及Find函数的 ...

  3. Excel中如何截取字符串中指定字符后的部分字符

    1.如何给某列属性为时间整体加一个时间值:      场景一:假如我有一个excel中的某一列如下图所示,如何将该列的时间(用B代替整列)整体加一分钟呢?方法很简单,在空白单元格填写时间格式图中A所示 ...

  4. String 类中的几个练习--获取指定字符串中,大写字母、小写字母、数字的个数||获取一个字符串中,另一个字符串出现的次数

    package cn.homework.demo1; public class GetCount { /* * 获取一个字符串中,另一个字符串出现的次数 * 思想: * 1. indexOf到字符串中 ...

  5. java判断字符串中是否包含中文 过滤中文

    package com.test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test ...

  6. Java 获取一个字符串中,另一个字符串出现的次数

    Java 获取一个字符串中,另一个字符串出现的次数 思想: 1. indexOf到字符串中到第一次出现的索引2. 找到的索引+被找字符串长度,截取字符串3. 计数器++ 代码实现: public cl ...

  7. java - 输入的字符串中是否包含中文

    今天和同事在讨论一个问题,需要检查“输入的字符串中是否包含中文”,刚开始想到是用正则表达式,正则表达式中是以[u4e00-u9fa5]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英 ...

  8. java截取字符串中的最后几个字符

    Java中的String类提供了一个substring(int from, int to)方法用于截取字符串中位置为from到to-1位置的字符. 因为字符串的字符位置是从0开始的,而substrin ...

  9. oracle 如何判断字符串中是否包含中文?超级简单!

      1.情景展示 如何快速的判断出指定字符串中是否包含中文呢? 2.解决方案 通过length()和lengthb()函数的比对结果进行判断. lengthb(string)计算string所占的字节 ...

随机推荐

  1. mysql之Query Cache

    1,QueryCache的实现原理: 1.目前只有select语句会被cache,其他类似show,use的语句则不会被cache. 2.两个SQL语句,只要相差哪怕是一个字符(例如大小写不一样:多一 ...

  2. Source Insight里头文件注释和函数头的注释

    1.将下述代码拷贝入一个文件,扩展名为em 2.打开BASE工程,添加本文件,并重新同步 3.添加hh_InsertFuncHeader的快捷键,即为函数头注释,光标需要放在函数名那一行,否则无效 4 ...

  3. sqlserver 2017 docker安装(启动代理)

    从 Docker Hub 中拉出 SQL Server 2017 Linux 容器映像. docker pull microsoft/mssql-server-linux:2017-latest 运行 ...

  4. word中从正文开始编码的方法

    假如第1页和第2页是首页和目录,你想从第3页的正文开始设置页码 1. 将光标移到第二页的最后位置,点击插入“分隔符”,选择“分节类型”的“下一页”,确定.这时光标自动移到第三页. 2. 点击插入页码, ...

  5. Json Schema的使用

    直接上案例: 在Web Api通讯中,客户端发送json数据,服务端反序列化json(json与某个类形成对应关系),在某些情况下,需要校验其上传的json是否合法. 服务端是使用Json.net(n ...

  6. 如何检查oracle的归档日志及空间占用率,清除归档日志

    如何解决“归档日志已满问题” 问题描述: 所用数据库为 Oracle 10g ,模式为归档模式,oracle 系统默认的归档空间为2G,由于日志过多,空间写满,数据库的redo文件不能归档,而出现or ...

  7. 19LaTeX学习系列之---LaTeX的总结

    目录 目录 前言 (一)本系列的章节目录 (二)快速温习LaTeX 1.介绍 2.源文件结构 3.文档的结构 4.字体的设置 5.图片的插入 6.表格的插入 7.数学公式的插入 8.交叉引用与浮动体 ...

  8. 6.1Python文件的操作(一)

    目录 目录 前言 (一)基础类型 ==1.只读== ==2.只写== ==3.追加== (二)b二进制组合 ==1.读写二进制文件== (三)+ 附加组合 ==1.读附加== ==2.写附加== == ...

  9. TG可能会用到的动态规划-简易自学

    最新更新 完整校订版见此 戳我阅读 以下为未核对不完整版本. 因版权原因,完整精校版不向所有公众开放. 请从您找到本博客的地址查找附带密码(比如简书分享了本网址,请您从简书分享页底部查询密码),感谢您 ...

  10. 简明 Vim 练级攻略------转自陈皓coolshell

    vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...