• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

提取字段部分内容 sql如何写 ? 字段内容如下:

chinawcs 石家庄市纵横网络技术有限公司 技术经理  2008-03-17 09:29:12
field1

照片21cm
彩图12cm
有光盘
21cm
null
....


想把这个字段中的 汉字 和其它的分开为两个字段(部分) 如:照片21cm 分离开为 照片 和 21cm

能实现吗 ?

...全文
102 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
JL99000 2008-03-17
这样的sql 我还是第一次用 最好能有点解释 能知道为什么 就最好了

'%[^吖-咗]%' 这个表达式 是什么意思呢 ?

谢谢 。 这次给你分了

跟着您 学到不少东西

---我告诉你吧
他的作用是做一个通陪符,意思就是要查找的字符串应该是以中文开头
回复
dawugui 2008-03-17
--如果中文全部在左边且连续,直接用一楼即可.

如果是中英文穿叉,用下面的函数.

create table tb(col char(20))
insert into tb values('照片21cm')
insert into tb values('彩图12cm')
insert into tb values('有光盘')
insert into tb values('21cm')
insert into tb values(null)
go

create function f_get_c(@oldstr varchar(100)) returns varchar(100)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^吖-咗]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end
go

create function f_get_e(@oldstr varchar(100)) returns varchar(100)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^a-z,A-Z,0-9]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end
go

select dbo.f_get_c(col) col_c , dbo.f_get_e(col) col_e from tb where col like('%[^吖-咗]%') or col like('%[^a-z,A-Z,0-9]%')
union all
select col1 = null,col2 = null from tb where col is null

drop table tb
drop function f_get_e
drop function f_get_c

/*
col_c col_e
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
照片 21cm
彩图 12cm
有光盘
21cm
NULL NULL

(所影响的行数为 5 行)
*/
回复
dawugui 2008-03-17
create table tb(col char(20))
insert into tb values('照片21cm')
insert into tb values('彩图12cm')
insert into tb values('有光盘')
insert into tb values('21cm')
insert into tb values(null)
go

create function f_get_c(@oldstr varchar(100)) returns varchar(100)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^吖-咗]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end
go

create function f_get_e(@oldstr varchar(100)) returns varchar(100)
as
begin
declare @i int
set @i = 1
while @i <= len(@oldstr)
if substring(@oldstr, @i, 1) like('[^a-z,A-Z,0-9]')
set @oldstr = replace(@oldstr, substring(@oldstr, @i, 1), '')
else
set @i = @i +1
return @oldstr
end
go

select id = identity(int , 1 , 1) , dbo.f_get_c(col) col_c into tmp1 from tb where col like('%[^吖-咗]%')
select id = identity(int , 1 , 1) , dbo.f_get_e(col) col_e into tmp2 from tb where col like('%[^a-z,A-Z,0-9]%')

select m.col_c , n.col_e from tmp1 m , tmp2 n where m.id = n.id
union all
select col1 = null,col2 = null from tb where col is null

drop table tb , tmp1 , tmp2
drop function f_get_e
drop function f_get_c

/*
col_c col_e
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
照片 21cm
彩图 12cm
有光盘
21cm
NULL NULL

(所影响的行数为 5 行)
*/
回复
chinawcs 2008-03-17
这样的sql 我还是第一次用 最好能有点解释 能知道为什么 就最好了

'%[^吖-咗]%' 这个表达式 是什么意思呢 ?

谢谢 。 这次给你分了

跟着您 学到不少东西
回复
山之魂2 2008-03-17
Mark
回复
dawugui 2008-03-17
create table tb(col char(20))
insert into tb values('照片21cm')
insert into tb values('彩图12cm')
insert into tb values('有光盘')
insert into tb values('21cm')
insert into tb values(null)
go

select col1=left(col,patindex('%[^吖-咗]%',col)-1),
col2=substring(col,patindex('%[^吖-咗]%',col),len(col))
from tb
where patindex('%[^吖-咗]%',col) > 0
union all
select col1 = null,col2 = null from tb where col is null

drop table tb

/*
col1 col2
-------------------- --------------------
照片 21cm
彩图 12cm
有光盘
21cm
NULL NULL

(所影响的行数为 5 行)
*/
回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-17 09:29
社区公告
暂无公告