TA的每日心情 | 怒 2015-9-10 15:08 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]测试小兵
|
前言: 前2天看到有朋友在问一个题目.一开始,都不知道怎么做,呵呵
数据库中的函数太多了,记不住
呵呵,后来翻了翻,找出来了.所以现在记录下来.免得以后又忘记了
题目是注意的
有2个表
其中一个表中有 1列
为 full_name . 现在要把这列中的数据
以空格为界, 分割开来,进而
插入到
第2个表中的
first_name 和 last name中去.
seven1 表
id full_name comments entrydate
1 bobo 哈哈 1905-6-12 0:00:00
2 seven bobo 哈哈2 1905-6-12 0:00:00
3 bill bobo 哈哈3 2009-1-20 0:00:00
4 bill sayhi 哈哈4 2009-1-20 0:00:00
seven2 表
id first_name last_name comments entrydate
1 bobo 1905-6-12 0:00:00
2 seven bobo 1905-6-12 0:00:00
3 bill bobo 2009-1-20 0:00:00
4 bill sayhi 2009-1-20 0:00:00
这里会用到以下的
语句: select substring(full_name,1,charindex(' ',full_name,1)) AS first_name from seven1
-- 首先 获取 full_name中,空格的位置, 然后截取full_name中, 从开始位置到空格位置的值,记为 first_name
select substring(full_name,CHARindex(' ',full_name,1)+1,len(full_name)) AS full_name FROM seven1
-- 首先 获取 full_name中,空格的位置, 然后截取full_name中, 从空格位置的值+1 到字段的最后位置 ,记为 last_name .这里因为只有2部分,所以只需要判断一次空格.如果有多个空格.则需要多写几次这个命令了.
--------------------------------------------命令解释!!!--------------------------------------------------------------------------
-- charindex('关键字',字段,n) 获取字段中,从第n个位置开始算起遇到关键字时候的位置.并且返回 ,下面以空格为例.
-- 比如 charindex(' ','222 3333 3333444 444',1) 获取第1个空格的位置
,最后的一个1 代表的意思为从起始位置算起
-- 如 SELECT charindex(' ','222 3333 3333444 444',1) 结果为4
-- 如 SELECT charindex(' ','222 3333 3333444 444',5) 结果为9
-- 如 SELECT charindex(' ','222 3333 3333444 444',6) 结果为9
-- substring(字段,开始位置,截取数目) 这是从字段中,截取从开始位置开始到截取位置结束的内容,并且返回
-- 比如 substring('222 3333 3333444 444',1,5)获取从第1个字符开始到第5个结束的字段.
-- 如select substring('222 3333 3333444 444',1,5)结果为'222 3'
-- 如select substring('222 3333 3333444 444',1,6)结果为'222 33'
-- 如select substring('222 3333 3333444 444',1,5)结果为'222 3'
-- 如select substring('222 3333 3333444 444',0,5)结果为'222 ' 注意 0
-- 如select substring('222 3333 3333444 444',-1,5)结果为'222' 注意 -1 .前面的参数是可以为负数的.
-- len(full_name) 获取字段的长度.
-----------------------------------------------------------------------------------------------------------------------------
好的,现在基本的分解工作完成了,下面就需要插入数据了..
这里可以用2种方法来做
第1种:直接更新(如果第2张表不对行数做限制的话,因为这样插入 ,会增加行数!比如这个表为空表)
INSERT INTO seven2(id,entrydate,comments,first_name,last_name)
-- full为关键字
,所以要用"" 标识.
SELECT id,entrydate,comments,
substring(full_name,1,charindex(' ',full_name,1)),
substring(full_name,CHARindex(' ',full_name,1)+1,len(full_name)) from seven1
第2种: 间接的更新(如果第2个表有了一些数据,不希望更新而产生新数据,则用update 来做.)
假设,表seven1同上, seven2为空. 现在为了seven2要有数据, 所以先生成一些.
用 1
INSERT INTO seven2(id,entrydate,comments ) SELECT id,entrydate,comments FROM seven1
这个可以把2个对等的字段复制过来. 实现2表之间的复制.
OK ,现在 seven1和 seven2表条数是相等的.此时,如果用第1种方法 ,行数就会不相等了.
用 2
SELECT * FROM seven1 LEFT JOIN seven2 ON seven1.id=seven2.id
这个可以实现2个表互联查看.结果为
id full_name comments entrydate id first_name last_name comments entrydate
1 bobo 哈哈 1905-6-12 0:00:00 1 哈哈 1905-6-12 0:00:00
2 seven bobo 哈哈2 1905-6-12 0:00:00 2 哈哈2 1905-6-12 0:00:00
3 bill bobo 哈哈3 2009-1-20 0:00:00 3 哈哈3 2009-1-20 0:00:00
4 bill sayhi 哈哈4 2009-1-20 0:00:00 4 哈哈4 2009-1-20 0:00:00
用 3
UPDATE seven2 SET first_name= substring(full_name,1,charindex(' ',full_name,1)),
last_name = substring(full_name,CHARindex(' ',full_name,1)+1,len(full_name))
FROM seven2
LEFT JOIN seven1 ON seven2.id=seven1.id
到此数据就这样更新好了...
ps : 附带新建和插入数据的命令
CREATE TABLE seven1 (
id INT,
first_name VARCHAR(40),
last_name VARCHAR(40),
comments TEXT,
entrydate DATETIME
);
INSERT INTO seven1 VALUES (1,'bobo 阿七','boy','mei没什么写的','2010-03-04 18:00');
[ 本帖最后由 阿七 于 2010-3-5 18:13 编辑 ] |
|