提取某nTEXT列中的特定格式字符串

简介:
最近,项目要求统计所有文章中出现的各支股票次数.文章内容存储在content列中,content为ntext类型.提取了一百行结果,得出下面规律:
1,在文章内容中区分股票可以用股票代码,股票代码为六位数字
2,股票代码都写在括号中,但括号中不一定都是股票代码
3,在括号中的股票代码前可能会出现"沪:","沪A:"等字符
   再加上ntext中每个字符都是占用两位长度,即a和阿都是两个字节,这样的话去除上面3中说的内容就比较容易了.
   考虑上面因素以后,我决定用游标遍历所有行,在行中先用charindex找出文章中前括号出现的位置,然后加1位进入括号内部,如果第一位不是数字第三位是数字,则删去括号中前两位的内容,如果第一位不是数字第四位是数字,则删去括号中前三位的内容.然后再在得到的新字符串中取括号后的六位,判断这六位如果是数字(股票代码都是数字组成),则输出后并去掉已提取过的括号查找下一括号.如果不是数字则直接查找下一括号.最后遍历所有行,取出文章中出现的所有代码并放入临时表中,最后再对临时表中的内容进行简单统计即可得出结果.
代码如下:
-------------------------------------------------------------------------------
/******提取股票出现的次数******/
create table #text_test_a(symbol varchar(20))
--临时表说明:存放在content中出现过的股票代码
truncate table #text_test_a
/*****创建游标从content列中取出股票代码******/
--由于在一行中可以出现多个股票代码,所以循环
--从每一行中取出所有股票代码

declare cur cursor 
for select cast(content as nvarchar(4000)) from news
--不能声明ntext数据类型,所以要转换成nvarchar类型
declare @content nvarchar(4000)
open cur
fetch next from cur into @content
while @@fetch_status=0
begin
while charindex('(',@content,0)>0
--如果行中存在括号则进入以下循环
begin
if isnumeric(substring(@content,charindex('(',@content,0)+1,1))=0 and isnumeric(substring(@content,charindex('(',@content,0)+3,1))=1
--由于括号中可能会出现“沪:600001”之类的股票代码,所以去除“沪:”
begin
set @content=stuff(@content,charindex('(',@content,0)+1,2,'')
end
if isnumeric(substring(@content,charindex('(',@content,0)+1,1))=0 and isnumeric(substring(@content,charindex('(',@content,0)+4,1))=1
--由于括号中可能会出现“沪A:600001”之类的股票代码,所以去除“沪A:”
begin
set @content=stuff(@content,charindex('(',@content,0)+1,3,'')
end
if isnumeric(substring(@content,charindex('(',@content,0)+1,6))=0
--如果括号中不为股票代码(即数字,.HK的股票代码也去掉),则忽略此括号,查找行中的下一括号的内容
begin
set @content=stuff(@content,1,charindex('(',@content,0)+1,'')
end
else
--如果是股票代码,则将其放入到临时表中,然后查找行中下一括号中的内容
begin
insert into #text_test_a
select substring(@content,charindex('(',@content,0)+1,6)
set @content=stuff(@content,1,charindex('(',@content,0)+1,'')
--select @content
end
end
fetch next from cur into @content
end
close cur
deallocate cur
--
/******统计每支股票出现的次数******/
select symbol,count(symbol) as coun from #text_test_a
group by symbol
order by symbol desc









本文转自 boyi55 51CTO博客,原文链接:http://blog.51cto.com/boyi55/46102,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
存储 Unix 编译器
%[ ]格式说明符巧用
%[ ]格式说明符巧用
18 0
|
9天前
|
编译器 C语言
字符串\统计字符
字符串\统计字符
8 3
|
1月前
|
数据库
在Excel中将某一列的格式通过数据分列彻底变为文本格式
在Excel中将某一列的格式通过数据分列彻底变为文本格式
78 0
excel中提取双引号之间的数据、提取括号中的数据
excel中提取双引号之间的数据、提取括号中的数据
|
12月前
|
Python
在阿里云RPA中,行数是以字符串的形式表示的,
在阿里云RPA中,行数是以字符串的形式表示的,
166 2
|
Python
一日一技:字符串format忽略缺失的字段
一日一技:字符串format忽略缺失的字段
72 0
|
SQL 前端开发 Java
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
如何将分隔数据转换为多值IN列表、如何按字母顺序排列字符串、如何对字符串字母去重后按字母顺序排列字符串、如何删除字符串中的字符保留数字。【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。这篇文章还是介绍的字符串处理案例,还是那句话,这些操作太太太常见了。后面还会写,而且是更麻烦更难的需求。
【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)
|
存储 SQL JSON
不全?MySQL数据类型精讲,定点日期枚举文本字符串,json二进制,空间,选择建议,完整详细可收藏
不全?MySQL数据类型精讲,定点日期枚举文本字符串,json二进制,空间,选择建议,完整详细可收藏
291 1
不全?MySQL数据类型精讲,定点日期枚举文本字符串,json二进制,空间,选择建议,完整详细可收藏
如何将Excel中以文本形式存储的数字批量快速地转换为数值类型
如何将Excel中以文本形式存储的数字批量快速地转换为数值类型
如何将Excel中以文本形式存储的数字批量快速地转换为数值类型
检索字符串中的字符串
检索字符串中的字符串
61 0