截取字符串中最后一个中文词语(MS SQL)
有朋友需求一个问题,就是处理一张表中某一字段,从这个字段中去截取内容中最后一个中文词语。
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)的更多相关文章
- Java 正则判断一个字符串中是否包含中文
使用正则判断一个字符串中是否包含中文或者中文字符 代码实现如下: import java.util.regex.Matcher; import java.util.regex.Pattern; /** ...
- [转]EXCEL截取字符串中某几位的函数——LeftMIDRight及Find函数的使用
原文地址:http://blog.sina.com.cn/s/blog_3f136a180102ymq5.html EXCEL截取字符串中某几位的函数 ——Left MID Right及Find函数的 ...
- Excel中如何截取字符串中指定字符后的部分字符
1.如何给某列属性为时间整体加一个时间值: 场景一:假如我有一个excel中的某一列如下图所示,如何将该列的时间(用B代替整列)整体加一分钟呢?方法很简单,在空白单元格填写时间格式图中A所示 ...
- String 类中的几个练习--获取指定字符串中,大写字母、小写字母、数字的个数||获取一个字符串中,另一个字符串出现的次数
package cn.homework.demo1; public class GetCount { /* * 获取一个字符串中,另一个字符串出现的次数 * 思想: * 1. indexOf到字符串中 ...
- java判断字符串中是否包含中文 过滤中文
package com.test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test ...
- Java 获取一个字符串中,另一个字符串出现的次数
Java 获取一个字符串中,另一个字符串出现的次数 思想: 1. indexOf到字符串中到第一次出现的索引2. 找到的索引+被找字符串长度,截取字符串3. 计数器++ 代码实现: public cl ...
- java - 输入的字符串中是否包含中文
今天和同事在讨论一个问题,需要检查“输入的字符串中是否包含中文”,刚开始想到是用正则表达式,正则表达式中是以[u4e00-u9fa5]来全匹配字符是否是中文,但现在面临的问题是这个字符串中还可能包含英 ...
- java截取字符串中的最后几个字符
Java中的String类提供了一个substring(int from, int to)方法用于截取字符串中位置为from到to-1位置的字符. 因为字符串的字符位置是从0开始的,而substrin ...
- oracle 如何判断字符串中是否包含中文?超级简单!
1.情景展示 如何快速的判断出指定字符串中是否包含中文呢? 2.解决方案 通过length()和lengthb()函数的比对结果进行判断. lengthb(string)计算string所占的字节 ...
随机推荐
- python自动化开发-7
socket编程 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对 ...
- linux定时任务调度定系统——opencron
linux定时任务调度定系统——opencron https://gitee.com/terrytan/opencron/#%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83 一 ...
- 《数据库系统概念》10-ER模型
通过建立实体到概念模型的映射,Entity-Relationship Model可以表达整个数据库的逻辑结构,很多数据库产品都采用E-R模型来表达数据库设计. 一.E-R模型采用了三个基本概念:实体集 ...
- web工程设计<mysql数据模型-数据类型的优化>
Schema与数据类型优化 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素. 一:选择优化的数据类型 ①:更小的通常更好 整数类型:M ...
- echart参数设置——曲线图
{ title: { text: '请求返回码分布', subtext: '实时数据' }, tooltip: { trigger: 'axis', position: function (point ...
- [20170728]oracle保留字.txt
[20170728]oracle保留字.txt --//oracle有许多保留字,我印象最深的就是使用rman备份表空间test,test就是rman里面的保留字.--//还有rman也是rman里面 ...
- python第二十一天---昨天没写完作业
作业 2, 模拟计算器开发:实现加减乘除及拓号优先级解析用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ...
- 解决windows下git push卡住问题的方法
问题描述: 在windows下向使用git协议传输的Git Repo进行push时会卡住. -- 这是windows上的msysgit的bug,在新版本上已经修复,但要在.gitconfig中做一项配 ...
- Windows服务器搭建Redis
1.下载安装Redis https://github.com/MicrosoftArchive/redis/releases 可以下载安装版(.msi)也可以下载解压版(.zip). 我直接下载的安装 ...
- 【PAT】B1065 单身狗(25 分)
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; int ca ...