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

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. python自动化开发-7

    socket编程 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对 ...

  2. linux定时任务调度定系统——opencron

    linux定时任务调度定系统——opencron https://gitee.com/terrytan/opencron/#%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83 一 ...

  3. 《数据库系统概念》10-ER模型

    通过建立实体到概念模型的映射,Entity-Relationship Model可以表达整个数据库的逻辑结构,很多数据库产品都采用E-R模型来表达数据库设计. 一.E-R模型采用了三个基本概念:实体集 ...

  4. web工程设计<mysql数据模型-数据类型的优化>

    Schema与数据类型优化 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素. 一:选择优化的数据类型 ①:更小的通常更好 整数类型:M ...

  5. echart参数设置——曲线图

    { title: { text: '请求返回码分布', subtext: '实时数据' }, tooltip: { trigger: 'axis', position: function (point ...

  6. [20170728]oracle保留字.txt

    [20170728]oracle保留字.txt --//oracle有许多保留字,我印象最深的就是使用rman备份表空间test,test就是rman里面的保留字.--//还有rman也是rman里面 ...

  7. python第二十一天---昨天没写完作业

    作业 2, 模拟计算器开发:实现加减乘除及拓号优先级解析用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ...

  8. 解决windows下git push卡住问题的方法

    问题描述: 在windows下向使用git协议传输的Git Repo进行push时会卡住. -- 这是windows上的msysgit的bug,在新版本上已经修复,但要在.gitconfig中做一项配 ...

  9. Windows服务器搭建Redis

    1.下载安装Redis https://github.com/MicrosoftArchive/redis/releases 可以下载安装版(.msi)也可以下载解压版(.zip). 我直接下载的安装 ...

  10. 【PAT】B1065 单身狗(25 分)

    #include<stdio.h> #include<algorithm> #include<math.h> using namespace std; int ca ...