sql 语句查询字段,根据分隔符截取该字符串输出

jakkyz 2014-01-16 09:50:58
有一个数据库database中数据表msg有三个字段,id,date,data

现在想把msg信息查询输出,
实现date字段按空格分成两个字段,如2014-1-16为日期字段,16:51:25为时间字段,
data字段按空格分为五个字段
最终效果如下:

我百度学习到可以用Split函数
select date.Split(' ')[0] as 日期,data.Split(' ')[1] as 时间 from msg
貌似不对
请高手指教
...全文
2116 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jakkyz 2014-01-24
  • 打赏
  • 举报
回复
引用 8 楼 zlp321002 的回复:

declare @t table(id int, date datetime,data varchar(2000))
insert into @t(id,date,data)
select 23,'2014-01-16 16:51:29.000','<PNBO>http.tcp 1389977721-1389977749 172.19.71.97:26111-61.158.246.131:80 861 2813'

select id,日期=convert(varchar(10),date,111),时间=convert(varchar(10),date,108),
信息1=substring(data,1,charindex(' ',data)),
信息2=PARSENAME(
replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
,4),
信息3=replace(PARSENAME(
replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
,3),'?','.'),
信息4=replace(PARSENAME(
replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
,2),'?','.'),
信息4=replace(PARSENAME(
replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
,1),'?','.')
from @t




非常感谢您
今天调试程序时又遇到问题
有一个表www内容如下
同样也是这几个字段,如下

如:
ID date data
3099 2014-01-24 16:49:15.000 <PNB0>www 1390581821 172.17.2.8 GET 182.118.63.38:1863 /4172356212.m3u8?apptype=unknow&pla=unknow&time=1390552690&cdn=zijian
实际上data字段和上面的不同,有5个空格6部分组成,如下
<PNB0>www 1390581821 172.17.2.8 GET 182.118.63.38:1863 /4172356212.m3u8?apptype=unknow&pla=unknow&time=1390552690&cdn=zijian
我想按照上面的办法同样分成五个字段,即把第五段和第六段合并为一段,不要之间的空格。
如果无法实现,就分成6个字段也行,我按照楼上的比葫芦画瓢写了一段检索出来不行。如下
select 日期=convert(varchar(10),date,111),时间=convert(varchar(10),date,108),信息1=substring(data,1,charindex(' ',data)),信息2=PARSENAME(replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.'),5),信息3=replace(PARSENAME(replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.'),4),'?','.'),信息4=replace(PARSENAME(replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.'),3),'?','.'),信息5=replace(PARSENAME(replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.'),2),'?','.'),信息6=replace(PARSENAME(replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.'),1),'?','.') from temp where data like '%www%';

检索结果如下

请指点
zlp321002 2014-01-17
  • 打赏
  • 举报
回复
data是一个非结构化数据,千万级的数据的话,写数据库/ETL 时候需要你优化,拆分存储成结构化数据; 如果不能改变这个结构,需要你写一个定时任务,转换成结构化数据,查询的时候查询结构化数据即可。 这种字符串操作,不管用什么方式,都非常耗资源。
zlp321002 2014-01-17
  • 打赏
  • 举报
回复

declare @t table(id int, date datetime,data varchar(2000))
insert into @t(id,date,data)
select 23,'2014-01-16 16:51:29.000','<PNBO>http.tcp 1389977721-1389977749 172.19.71.97:26111-61.158.246.131:80 861 2813'
 
select id,日期=convert(varchar(10),date,111),时间=convert(varchar(10),date,108),
信息1=substring(data,1,charindex(' ',data)),
信息2=PARSENAME(
    replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
    ,4),
信息3=replace(PARSENAME(
    replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
    ,3),'?','.'),
信息4=replace(PARSENAME(
    replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
    ,2),'?','.'),
信息4=replace(PARSENAME(
    replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
    ,1),'?','.')
from @t


jakkyz 2014-01-17
  • 打赏
  • 举报
回复
引用 2 楼 zlp321002 的回复:
declare @t table(id int, date datetime,data varchar(2000))
insert into @t(id,date,data)
select 23,'2014-01-16 16:51:29.000','<PNBO>qqlogin 1389890756 451748998 172.16.2.48 112.95.240.203'

select id,日期=convert(varchar(10),date,111),时间=convert(varchar(10),date,108),
信息1=substring(data,1,charindex(' ',data)),
信息2=PARSENAME(
replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
,4),
信息3=PARSENAME(
replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
,3),
信息4=replace(PARSENAME(
replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
,2),'?','.'),
信息4=replace(PARSENAME(
replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
,1),'?','.')
from @t


今天发现问题了
有一个数据表数据如下



用了这个sql语句检索出来之后结果如下



信息3字段"."都变成"?"了
请教是哪里的问题?
發糞塗牆 2014-01-17
  • 打赏
  • 举报
回复
最好的方法可能是改设计,把数据适当地拆分成多列存放
發糞塗牆 2014-01-17
  • 打赏
  • 举报
回复
引用 3 楼 jakkyz 的回复:
[quote=引用 2 楼 zlp321002 的回复:]
declare @t table(id int, date datetime,data varchar(2000))
insert into @t(id,date,data)
select 23,'2014-01-16 16:51:29.000','<PNBO>qqlogin 1389890756 451748998 172.16.2.48 112.95.240.203'

select id,日期=convert(varchar(10),date,111),时间=convert(varchar(10),date,108),
信息1=substring(data,1,charindex(' ',data)),
信息2=PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,4),
信息3=PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,3),
信息4=replace(PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,2),'?','.'),
信息4=replace(PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,1),'?','.')
from @t

你的方法已经实现了,不过sql语句这么长,如果有上千万条记录查询起来效率应该很低了 不知道还有没有更优化的语句么? 不过先谢谢你。[/quote]上千万级不能单纯从语句层面改进,即使有索引在上面,这样拆分也会导致索引无效,所以sqlserver很大可能还是全表扫描,再拆
jakkyz 2014-01-16
  • 打赏
  • 举报
回复
引用 2 楼 zlp321002 的回复:
declare @t table(id int, date datetime,data varchar(2000))
insert into @t(id,date,data)
select 23,'2014-01-16 16:51:29.000','<PNBO>qqlogin 1389890756 451748998 172.16.2.48 112.95.240.203'

select id,日期=convert(varchar(10),date,111),时间=convert(varchar(10),date,108),
信息1=substring(data,1,charindex(' ',data)),
信息2=PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,4),
信息3=PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,3),
信息4=replace(PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,2),'?','.'),
信息4=replace(PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,1),'?','.')
from @t

你的方法已经实现了,不过sql语句这么长,如果有上千万条记录查询起来效率应该很低了 不知道还有没有更优化的语句么? 不过先谢谢你。
zlp321002 2014-01-16
  • 打赏
  • 举报
回复
declare @t table(id int, date datetime,data varchar(2000))
insert into @t(id,date,data)
select 23,'2014-01-16 16:51:29.000','<PNBO>qqlogin 1389890756 451748998 172.16.2.48 112.95.240.203'

select id,日期=convert(varchar(10),date,111),时间=convert(varchar(10),date,108),
信息1=substring(data,1,charindex(' ',data)),
信息2=PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,4),
信息3=PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,3),
信息4=replace(PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,2),'?','.'),
信息4=replace(PARSENAME(
	replace(replace(replace(data,substring(data,1,charindex(' ',data)),''),'.','?'),' ','.')
	,1),'?','.')
from @t

--小F-- 2014-01-16
  • 打赏
  • 举报
回复
如果是SQL SERVER的话 是没有Split函数的 需要自己写函数。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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