字段的分割问题

zjroland 2010-11-24 09:08:12
有一个 ntext 类型的字段 CityGuide ,里面的文字都是类似这样的:




北京是我国拥有帝王宫殿数量最多的城市

Attractions

位于城市中心的就是著名的紫禁城——故宫

Shopping

王府井大街是北京最著名的购物区





现在要把 CityGuide 分割为3个字段, Brief、Attractions、Shopping (都是ntext) , 把 ‘北京是我国拥有帝王宫殿数量最多的城市’ 放入 Brief字段, 把"位于城市中心的就是著名的紫禁城——故宫"放入 Attractions字段,把"王府井大街是北京最著名的购物区" 放入 Shopping字段,请问用查询语句怎么写?

...全文
196 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
abuying 2010-11-24
  • 打赏
  • 举报
回复
--text字段替换处理示例 
--邹建 2004.07(引用请保留此信息)

--测试数据
create table tb(id int identity(1,1),content ntext)
insert tb select '001,002 '
union all select '001,002,003,004,005,006,007,008,009,010 '
go

--替换处理
declare @s_str nvarchar(4000),@r_str nvarchar(4000)
select @s_str= '02 ' --要替换的字符串
,@r_str= '**02 ' --替换成该字符串

--替换处理
declare @id int,@ptr varbinary(16)
declare @start int,@s nvarchar(4000),@len int
declare @s_str1 nvarchar(4000),@s_len int,@i int,@step int

select @s_str1=reverse(@s_str),@s_len=len(@s_str)
,@step=case when len(@r_str)> len(@s_str)
then 4000/len(@r_str)*len(@s_str)
else 4000 end

declare tb cursor local for
select id,start=charindex(@s_str,[content])-1
from [tb]
where id=2 --替换id=1的记录
and charindex(@s_str,[content])> 0

open tb
fetch tb into @id,@start
while @@fetch_status=0
begin
select @ptr=textptr([content])
,@s=substring([content],@start+1,@step)
from [tb]
where id=@id

while len(@s)> =@s_len
begin
select @len=len(@s),@i=charindex(@s_str1,reverse(@s))
if @i> 0
begin
select @i=case when @i> =@s_len then @s_len else @i end
,@s=replace(@s,@s_str,@r_str)
updatetext [tb].[content] @ptr @start @len @s
end
else
set @i=@s_len
select @start=@start+len(@s)-@i+1
,@s=substring([content],@start+1,@step)
from [tb]
where id=@id
end
fetch tb into @id,@start
end
close tb
deallocate tb
go

--显示处理结果
select * from tb
go

--删除测试
drop table tb

/*--测试结果

id content
----------- ----------------------------------------------
1 001,002
2 001,0**02,003,004,005,006,007,008,009,010

(所影响的行数为 2 行)

--*/
nice_dream_li 2010-11-24
  • 打赏
  • 举报
回复

CREATE TABLE TB (aa NVARCHAR(4000))
INSERT INTO tb
SELECT '1xxxxAttractionsxxxxxxxxx1
Attractions
2xxxxxxxxxAttractionsxxxxxxxxx2
Shopping
3xxxxxxxxxxxxxxxxxxxxxxxxxxx3
Eating Out
4xxxxxxxxxxxxxxxxxxxxx4
Accommodation
5xxxxxxxxxxxxxAccommodationxxxxxxxxxxxxx5
Transportation
6xxxxxxxxxxx6
Climate
7xxxxxxxxxxxxxxxxxxxxxxxxxxxx7
'

测试数据弄成这样应该好看点 哈哈
chuifengde 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 zjroland 的回复:]

是用的sql2005
[/Quote]
上面列的都是2005的方法,至于字段的关键字有可能有重复,那你得找出字段的规律,否则没法判断哪些是内容哪些是字段
nice_dream_li 2010-11-24
  • 打赏
  • 举报
回复

CREATE TABLE TB (aa NVARCHAR(4000))
INSERT INTO tb
SELECT '1xxxxxxxxxxxxxxxxxxxx1
Attractions
2xxxxxxxxxAttractionsxxxxxxxxx2
Shopping
3xxxxxxxxxxxxxxxxxxxxxxxxxxx3
Eating Out
4xxxxxxxxxxxxxxxxxxxxx4
Accommodation
5xxxxxxxxxxxxxAccommodationxxxxxxxxxxxxx5
Transportation
6xxxxxxxxxxx6
Climate
7xxxxxxxxxxxxxxxxxxxxxxxxxxxx7
'
UPDATE tb
SET aa=REPLACE(aa,'Attractions
','''as brief,''')
UPDATE tb
SET aa=REPLACE(aa,'Shopping
','''as Attractions,''')
UPDATE tb
SET aa=REPLACE(aa,'Eating Out
','''as Shopping,''')
UPDATE tb
SET aa=REPLACE(aa,'Accommodation
','''as [ating Out],''')
UPDATE tb
SET aa=REPLACE(aa,'Transportation
','''as Accommodation,''')
UPDATE tb
SET aa=REPLACE(aa,'Climate
','''as Transportation,''')

DECLARE @sql NVARCHAR(4000)
SELECT @sql='select '''+aa+''' as Climate FROM tb ' FROM dbo.TB
EXEC(@sql)

--------------------------结果

brief Attractions Shopping ating Out Accommodation Transportation Climate
1xxxxxxxxxxxxxxxxxxxx1 2xxxxxxxxxAttractionsxxxxxxxxx2 3xxxxxxxxxxxxxxxxxxxxxxxxxxx3 4xxxxxxxxxxxxxxxxxxxxx4 5xxxxxxxxxxxxxAccommodationxxxxxxxxxxxxx5 6xxxxxxxxxxx6 7xxxxxxxxxxxxxxxxxxxxxxxxxxxx7
zjroland 2010-11-24
  • 打赏
  • 举报
回复
是用的sql2005
chuifengde 2010-11-24
  • 打赏
  • 举报
回复
要保证通用
2000中比较难,因为ntext类型被substring截取后就变成了nvarchar类型,也就是截取的字符数不能超过4000,但可以通过程序拆分处理后再插入新表。
2005或2008中可以先转成max再截取
zjroland 2010-11-24
  • 打赏
  • 举报
回复
比如下面这样的:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Attractions

2xxxxxxxxxxxxxxxxxxxx2 Attractions xxxxxxxxxxxxx

Shopping

3xxxxxxxxxxxxxxxxxxxxxxxxxxx3 Shopping xxxxxxxxxxxxxxx

Eating Out

4xxxxxxxxxxxxxxxxxxxxx4 Eating Out xxxxxxxxxxx

Accommodation

5xxxxxxxxxxxxxxxxxxxxxxxxxxx5 Accommodation xxxxxxxxxxxxxxx

Transportation

6xxxxxxxxxxx6

Climate

7xxxxxxxxxxxxxxxxxxxxxxxxxxxx7
zjroland 2010-11-24
  • 打赏
  • 举报
回复
分段的字段在字符串比如Attractions 是占用一行的(即后面有几十个空格),而内容中的Attractions即使有空格,也最多前后一个空格,这就是标志啊
nice_dream_li 2010-11-24
  • 打赏
  • 举报
回复
那楼主要想办法保证用于分段的字段在字符串的其他地方不会出现,比如给他加上()或者@ 这种之类不容易出现的字符
nice_dream_li 2010-11-24
  • 打赏
  • 举报
回复
nice_dream_li 2010-11-24
  • 打赏
  • 举报
回复
借用下楼上数据


CREATE TABLE TB (aa NVARCHAR(4000))
INSERT INTO tb
SELECT '1xxxxxxxxxxxxxxxxxxxx1
Attractions
2xxxxxxxxxxxxxxxxxxxx2
Shopping
3xxxxxxxxxxxxxxxxxxxxxxxxxxx3
Eating Out
4xxxxxxxxxxxxxxxxxxxxx4
Accommodation
5xxxxxxxxxxxxxxxxxxxxxxxxxxx5
Transportation
6xxxxxxxxxxx6
Climate
7xxxxxxxxxxxxxxxxxxxxxxxxxxxx7
'
UPDATE tb
SET aa=REPLACE(aa,'Attractions','''as brief,''')
UPDATE tb
SET aa=REPLACE(aa,'Shopping','''as Attractions,''')
UPDATE tb
SET aa=REPLACE(aa,'Eating Out','''as Shopping,''')
UPDATE tb
SET aa=REPLACE(aa,'Accommodation','''as [ating Out],''')
UPDATE tb
SET aa=REPLACE(aa,'Transportation','''as Accommodation,''')
UPDATE tb
SET aa=REPLACE(aa,'Climate','''as Transportation,''')

DECLARE @sql NVARCHAR(4000)
SELECT @sql='select '''+aa+''' as Climate FROM tb ' FROM dbo.TB
EXEC(@sql)

这样应该也能满足楼主要求
哈哈
zjroland 2010-11-24
  • 打赏
  • 举报
回复
直接在里面加10个空格,可以吗?

SELECT LEFT(@STR,CHARINDEX('Attractions',@STR)-1) AS Brief
,SUBSTRING(@STR,CHARINDEX('Attractions ',@STR)+21,CHARINDEX('Shopping',@STR)-CHARINDEX('Attractions',@STR)-11) AS Attractions
,SUBSTRING(@STR,CHARINDEX('Shopping ',@STR)+18,CHARINDEX('Eating Out',@STR)-CHARINDEX('Shopping',@STR)-8) AS Shopping
,SUBSTRING(@STR,CHARINDEX('Eating Out ',@STR)+20,CHARINDEX('Accommodation',@STR)-CHARINDEX('Eating Out',@STR)-10) AS [Eating Out]
,SUBSTRING(@STR,CHARINDEX('Accommodation ',@STR)+23,CHARINDEX('Transportation',@STR)-CHARINDEX('Accommodation',@STR)-13) AS Accommodation
,SUBSTRING(@STR,CHARINDEX('Transportation ',@STR)+24,CHARINDEX('Climate',@STR)-CHARINDEX('Transportation',@STR)-14) AS Transportation
,RIGHT(@STR,LEN(@STR)-CHARINDEX('Climate',@STR)-7) AS Climate
王向飞 2010-11-24
  • 打赏
  • 举报
回复
那此题无解了。。。
zjroland 2010-11-24
  • 打赏
  • 举报
回复
假如把 2xxxxxxxxxxxxxxxxxxxx2 改为
2xxxxxxxxxxxxxxxxxxxx2 Attractions xxxxxxxxxxxxxxxxx就截取错了,还得考虑内容中也有Attractions 字符串这个问题。
飘零一叶 2010-11-24
  • 打赏
  • 举报
回复
DECLARE @STR NVARCHAR(MAX)
SET @STR='1xxxxxxxxxxxxxxxxxxxx1
Attractions
2xxxxxxxxxxxxxxxxxxxx2
Shopping
3xxxxxxxxxxxxxxxxxxxxxxxxxxx3
Eating Out
4xxxxxxxxxxxxxxxxxxxxx4
Accommodation
5xxxxxxxxxxxxxxxxxxxxxxxxxxx5
Transportation
6xxxxxxxxxxx6
Climate
7xxxxxxxxxxxxxxxxxxxxxxxxxxxx7
'

SELECT LEFT(@STR,CHARINDEX('Attractions',@STR)-1) AS Brief
,SUBSTRING(@STR,CHARINDEX('Attractions',@STR)+11,CHARINDEX('Shopping',@STR)-CHARINDEX('Attractions',@STR)-11) AS Attractions
,SUBSTRING(@STR,CHARINDEX('Shopping',@STR)+8,CHARINDEX('Eating Out',@STR)-CHARINDEX('Shopping',@STR)-8) AS Shopping
,SUBSTRING(@STR,CHARINDEX('Eating Out',@STR)+10,CHARINDEX('Accommodation',@STR)-CHARINDEX('Eating Out',@STR)-10) AS [Eating Out]
,SUBSTRING(@STR,CHARINDEX('Accommodation',@STR)+13,CHARINDEX('Transportation',@STR)-CHARINDEX('Accommodation',@STR)-13) AS Accommodation
,SUBSTRING(@STR,CHARINDEX('Transportation',@STR)+14,CHARINDEX('Climate',@STR)-CHARINDEX('Transportation',@STR)-14) AS Transportation
,RIGHT(@STR,LEN(@STR)-CHARINDEX('Climate',@STR)-7) AS Climate

----------------------------
Brief Attractions Shopping Eating Out Accommodation Transportation Climate
1xxxxxxxxxxxxxxxxxxxx1 2xxxxxxxxxxxxxxxxxxxx2 3xxxxxxxxxxxxxxxxxxxxxxxxxxx3 4xxxxxxxxxxxxxxxxxxxxx4 5xxxxxxxxxxxxxxxxxxxxxxxxxxx5 6xxxxxxxxxxx6 7xxxxxxxxxxxxxxxxxxxxxxxxxxxx7
zjroland 2010-11-24
  • 打赏
  • 举报
回复
我觉得应该截长一些,因为内容也有是英文的,假如里面也有Attractions就惨了。干脆就截取
Attractions ,(字符加20个空格总共31个),这样就不会混淆了。
飘零一叶 2010-11-24
  • 打赏
  • 举报
回复
字段太多了,截取的时候注意一下本身的长度.
Attractions 11
Shopping 8
Eating Out ..
......... ..

zjroland 2010-11-24
  • 打赏
  • 举报
回复
请高手按7个字段的写写,这就结贴了。。。,实在没有分析清怎么左右取数
zjroland 2010-11-24
  • 打赏
  • 举报
回复
呵呵,就是分割为7个字段
王向飞 2010-11-24
  • 打赏
  • 举报
回复
照我9楼的,其实就是左右取数,

你到底有多少个字段,这不是要把人整死吗
加载更多回复(12)

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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