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

~~~~~~~~~~~高分,字符串截取问题。求教~~~~~~!!!!!

wendi 2006-10-26 11:51:26
假设现在一个表中有三个字段,表结构如下:

A | B C D
0/5/9 |
01/15/12 |

我如何通过一个统一的语句将字段A中的数据的第一个数字截取出来放到B中,第二个数字放到C中,第三个数字放到D中。

谢谢!!
...全文
215 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zjcxc 元老 2006-10-26
SELECT
a=PARSENAME(REPLACE(a, '/', '.'), 3),
b=PARSENAME(REPLACE(a, '/', '.'), 2),
c=PARSENAME(REPLACE(a, '/', '.'), 1)
FROM(
SELECT a = '0/1/2'
)A

-- 结果:
a b c
0 1 2
回复
老本 2006-10-26
如果需要,进行ISNULL处理。
回复
老本 2006-10-26
最好的办法是采用SQL Server 的计算列,但是非常不幸,这样不行。
其次就是采用视图。

DROP TABLE TA
GO

CREATE TABLE TA(A VARCHAR(50))
GO

DROP VIEW VA
GO

CREATE VIEW VA AS
select A,
left(A,charindex('/',A)-1) AS B,
Left(stuff(A,1,charindex('/',A),''),charindex('/',stuff(A,1,charindex('/',A),''))-1) AS C,
Reverse(left(reverse(A),charindex('/',reverse(A))-1)) AS D
FROM TABLE1
GO

INSERT INTO TA VALUES('0/5/9')
INSERT INTO TA VALUES('01/15/12')
GO

SELECT * FROM VA
回复
BFDLRG 2006-10-26
如果A字段为日期型
update a set b=DAY(aa.a),c=MONTH(aa.a),d=YEAR(aa.a) from a, (select a from a) as aa where aa.a=a.a
回复
九斤半 2006-10-26
CREATE TABLE TEST(A NVARCHAR(40),B NVARCHAR(40),C NVARCHAR(40),D NVARCHAR(40))

INSERT TEST SELECT '0/5/9',NULL,NULL,NULL
INSERT TEST SELECT '01/15/12',NULL,NULL,NULL
SELECT * FROM TEST

UPDATE TEST SET
B=LEFT(A,CHARINDEX('/',A)-1),
C=SUBSTRING(A,CHARINDEX('/',A)+1,CHARINDEX('/',A,CHARINDEX('/',A))-1),
D=RIGHT(A,CHARINDEX('/',REVERSE(A))-1)

SELECT * FROM TEST

DROP TABLE TEST
回复
子陌红尘 2006-10-26
如果字符串中不包含".",可以用一个变通的办法:

declare @t table(A varchar(20),B varchar(10),C varchar(10),D varchar(10))
insert into @t(A) select '0/5/9'
insert into @t(A) select '01/15/12'

update @t
set
B=PARSENAME(replace(A,'/','.'),3),
C=PARSENAME(replace(A,'/','.'),2),
D=PARSENAME(replace(A,'/','.'),1)


select * from @t
/*
A B C D
-------------------- ---------- ---------- ----------
0/5/9 0 5 9
01/15/12 01 15 12

*/
回复
子陌红尘 2006-10-26
declare @t table(A varchar(20),B varchar(10),C varchar(10),D varchar(10))
insert into @t(A) select '0/5/9'
insert into @t(A) select '01/15/12'

update @t
set
B=left(A,charindex('/',A)-1),
C=left(stuff(A,1,charindex('/',A),''),charindex('/',stuff(A,1,charindex('/',A),''))-1),
D=reverse(left(reverse(A),charindex('/',reverse(A))-1))


select * from @t
/*
A B C D
-------------------- ---------- ---------- ----------
0/5/9 0 5 9
01/15/12 01 15 12

*/
回复
dawugui 2006-10-26
CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1,'中国;日本;韩国' UNION ALL
SELECT 2,'美国;意大利;法国' UNION ALL
SELECT 3,'德国'
SELECT * FROM A

-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b


SELECT
A.ID,
COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX(';', A.COUNTRY + ';', B.ID) - B.ID)
FROM A, # B
WHERE SUBSTRING(';' + a.COUNTRY, B.id, 1) = ';'
ORDER BY 1,2
GO


DROP TABLE A,#
回复
九斤半 2006-10-26
查找/

CHARINDEX
回复
white_porpoise 2006-10-26
PARSENAME(REPLACE(a, '/', '.'), 3)
确实强,学习了
回复
marco08 2006-10-26
老大就是老大, 與眾不同
回复
abc_sk 2006-10-26
..
回复
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2006-10-26 11:51
社区公告
暂无公告