substr函数功能:
截取数据库某一列字段中的一部分
在各个数据库的函数名称不一样:
mysql: SUBSTR( ), SUBSTRING( )
Oracle: SUBSTR( )
SQL Server: SUBSTRING( ) ;
常用方式:
SBUSTR(str,pos);
就是从pos开始的位置,一直截取到最后。
一种比较常用的是:
SUBSTR(str,pos,len);
就是从pos开始的位置,截取len个字符(空白也算字符)。
注意:如果pos为1(而不是0),表示从第一个位置开始。
因为数据库不是我们平时写程序,他有他自己的一套习惯,数据库的记录都是从1开始没有从0开始。是吧。
第二部分,sql中substr函数用法举例
【格式】
截取函数,可以实现提取字符串中指定的字符数
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语句,如下:
SQL> create table hyl as select * from emp where 1=2; --创建实验表 Table created SQL> select * from hyl; --查询实验表,目前数据为空 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ SQL> alter table hyl add(ename1 char(15)); --向实验表中添加实验列ename1,用于模拟长字符字段 Table altered SQL> insert into hyl(ename1) select emp.ename as ename1 from emp; --将emp表的ename列数据以定长字段的数据类型插入到了实验表hyl的ename1列上,此时ename1字段长度为15 14 rows inserted SQL> 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 MILLER 14 rows selected SQL> select count(1) from hyl t where length(t.ename1)=15; --验证一下,ename1列字段超过10的数据行数 COUNT(1) ---------- 14 SQL> 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.ename1 ORA-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 updated SQL> 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 MILLER 14 rows selected SQL> 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