首页 > 代码库 > SQL_substr函数实验

SQL_substr函数实验

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39966251

【格式】
截取函数,可以实现提取字符串中指定的字符数
substr( string, start_position, [ length ] )
string:源字符串
start_position:提取的位置,字符串中第一个位置始终为1
[ length ]:提取的字符数,如果省略,substr将返回整个字符串

【实验】

目标:
    体会substr函数的用法

实验思路:
    实现将某列上指定字符位数的数据插入到指定的列上

模拟现场需求:
    设想稍微复杂一下,我们假定需要将ename列的内容更改为ename1列的内容,但此时ename1列的字段长度超过了ename列的字段要求的最大长度,经过查看发现出现ename1列字段超出ename列字段长度的原因是ename1列数据类型为char(15),而且实际有效数据长度不到7个字符,所以只需要将ename1列的前7位字符全部提取出来插入到ename列即可。这也说明对于定长char类型,当输入字符不足定长时是会用空格进行补位的。

说明:
    这种实验想法的出现,其实是映射了实际生产需求中的一个例子。在实际生产环境上,要实现把一个用户的信息某一列的数据抽取到另外一个用户上,但由于两者列的数据类型不同,存在空格致使字段长度超过了另外一个用户要求该列字段的长度,而两者不可以更改数据类型,但是有效的字段数是都符合这两个列的,因此想到使用substr来完成这个操作。

SQL> create table hyl as select * from emp where 1=2;--创建实验表Table createdSQL> select * from hyl;--查询实验表,目前数据为空EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO----- ---------- --------- ----- ----------- --------- --------- ------SQL> alter table hyl add(ename1 char(15));--向实验表中添加实验列ename1,用于模拟长字符字段Table alteredSQL> insert into hyl(ename1) select emp.ename as ename1 from emp;--将emp表的ename列数据以定长字段的数据类型插入到了实验表hyl的ename1列上,此时ename1字段长度为1514 rows insertedSQL> select * from hyl;--查看插入到ename1列上的数据EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO ENAME1----- ---------- --------- ----- ----------- --------- --------- ------ ---------------                                                                        SMITH                                                                        ALLEN                                                                        WARD                                                                        JONES                                                                        MARTIN                                                                        BLAKE                                                                        CLARK                                                                        SCOTT                                                                        KING                                                                        TURNER                                                                        ADAMS                                                                        JAMES                                                                        FORD                                                                        MILLER14 rows selectedSQL> select count(1) from hyl t where length(t.ename1)=15;--验证一下,ename1列字段超过10的数据行数  COUNT(1)----------        14SQL> desc hyl;--查看hyl表的表结构,可以看到ename1列为char(15),ename列为varchar2(10)Name     Type         Nullable Default Comments -------- ------------ -------- ------- -------- EMPNO    NUMBER(4)    Y                         ENAME    VARCHAR2(10) Y                         JOB      VARCHAR2(9)  Y                         MGR      NUMBER(4)    Y                         HIREDATE DATE         Y                         SAL      NUMBER(7,2)  Y                         COMM     NUMBER(7,2)  Y                         DEPTNO   NUMBER(2)    Y                         ENAME1   CHAR(15)     Y   SQL> update hyl t set t.ename=t.ename1;--更新ename列为ename1上数据时,报错了如下,提示ename字段长度(10)小于ename1字段长度(15),无法完成数据的更新 update hyl t set t.ename=t.ename1ORA-12899: value too large for column "SCOTT"."HYL"."ENAME" (actual: 15, maximum: 10)SQL> update hyl t set t.ename=substr(t.ename1,1,7);--使用substr函数,只把ename1列的前7个字符的内容更新到ename列上14 rows updatedSQL> select * from hyl;--再次查看hyl表,发现ename列的数据已经成功更新为enam1列上的数据EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO ENAME1----- ---------- --------- ----- ----------- --------- --------- ------ ---------------      SMITH                                                             SMITH      ALLEN                                                             ALLEN      WARD                                                              WARD      JONES                                                             JONES      MARTIN                                                            MARTIN      BLAKE                                                             BLAKE      CLARK                                                             CLARK      SCOTT                                                             SCOTT      KING                                                              KING      TURNER                                                            TURNER      ADAMS                                                             ADAMS      JAMES                                                             JAMES      FORD                                                              FORD      MILLER                                                            MILLER14 rows selectedSQL> desc hyl;--再次查看hyl表的数据结构,体会如何将ename1列数据类型为char(15)中前7个字符插入到数据类型为varchar2(10)的ename列上去的Name     Type         Nullable Default Comments -------- ------------ -------- ------- -------- EMPNO    NUMBER(4)    Y                         ENAME    VARCHAR2(10) Y                         JOB      VARCHAR2(9)  Y                         MGR      NUMBER(4)    Y                         HIREDATE DATE         Y                         SAL      NUMBER(7,2)  Y                         COMM     NUMBER(7,2)  Y                         DEPTNO   NUMBER(2)    Y                         ENAME1   CHAR(15)     Y     

 原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/39966251

SQL_substr函数实验