您的位置:首页 > 数据库 > MySQL

mysql字符串截取函数应用介绍

2012-11-05 19:55 405 查看
1. 数据库中的roleId字段(varchar类型),现在根据roleId字段来计算统计serviceId的种类。ServiceId是通过roleId%10000得到,即roleId的后四位。表名为cbgdonedealinfo_copy.数据库为mysql数据库

本题的需求通过下面的方法很容易实现

方法1:直接运算

SELECT DISTINCT roleId %10000 as serviceidFROM cbgdonedealinfo_copy;

借此机会再应用mysql的几个基本函数来实现一下。

方法2:应用CAST函数

CAST(expr AS type)函数介绍:expr待转化的表字段或是字段具体内容,type待转化的类型,这个类型是有范围的,不是可以转为所有的类型。

Type可以转换的类型是有限制的。这个类型可以是以下值其中的一个:

二进制,同带binary前缀的效果 : BINARY

字符型,可带参数 : CHAR()

日期 : DATE

时间: TIME

日期时间型: DATETIME

浮点数: DECIMAL

整数: SIGNED

无符号整数 : UNSIGNED

其中SIGNED是转为有符号类型而UNSIGNED是转为无符号类型,在查询结果显示时转为SIGNED时在表格中是以右对齐方式显示,而UNSIGNED是以左对齐方式显示。

本题需求应用CAST函数sql语句如下:

SELECT DISTINCT CAST(roleId asUNSIGNED)%10000 as serviceId from cbgdonedealinfo_copy;

方法3:应用CONVERT函数

CONVERT函数的用法介绍:CONVERT(expr,type),其中type可取类型同CAST函数可取类型一样,也不是所有的类型都可以转换。

本题需求应用CONVERT函数sql语句如下:

SELECT DISTINCTCONVERT(roleId,UNSIGNED)%10000 as serviceId from cbgdonedealinfo_copy;

方法4:应用SUBSTRING函数

SUBSTRING(str,pos)介绍:str待传化的表字段或是字段具体内容,pos是位置,当pos值为正数,表示从正向截取从pos位置到字段结束的字符,若pos是负数则表示从返向即从字符末尾开始数到长度为pos的位置,也即倒数第pos个位置开始到字段结束。所以上述需求中要得到roleId的后四位则pos值取-4,sql语句如下:

SELECT DISTINCT SUBSTRING(roleId,-4) FROM cbgdonedealinfo_copy ;

若想做一个排序,可以将转换后的值取一个别名,然后按这个字段排序

SELECT DISTINCT SUBSTRING(roleId,-4) asserviceId FROM cbgdonedealinfo_copy ORDER BY serviceId ;

根据参数的不同,SUBSTRING函数还有以下几种:

SUBSTRING(str FROM pos FOR len)

SUBSTRING(str FROM pos)

SUBSTRING(str,pos,len)

SUBSTRING函数也可用简化的SUBSTR函数代替,参数SUBSTRING函数一样。

SUBSTR(str FROM pos FOR len)

SUBSTR(str FROM pos)

SUBSTR(str,pos)

SUBSTR(str,pos,len)

*特别注意:字符串中的第一个位置始终为1。

还有一个很重要的截取函数

SUBSTRING_INDEX(str,delim,count),str待截取的表字段或是字段具体内容,delim截取的分隔符,count表示分隔符出现的次数,若count为正数表示返回从遇到第count个分隔符开始之前的所有字符,而count为负数时表示返回从遇到第count个分隔符开始其后的所有字符。如本表中还有一个字段ipArea中符中间是以逗号分隔的,现在想取出第二个逗号之前的内容,sql语句如下:

SELECT DISTINCTSUBSTRING_INDEX(ipArea,',',2) from cbgdonedealinfo_copy

若想取得第二个逗号之后的内容,sql语句如下:

SELECT DISTINCTSUBSTRING_INDEX(ipArea,',',-2) from cbgdonedealinfo_copy

对于本题需求,应用上面的函数实现的sql语句如下:

SELECT DISTINCT SUBSTRING(roleId FROM -4 FOR4) as serviceId FROM cbgdonedealinfo_copy ORDER BY serviceId ;

SELECT DISTINCT SUBSTRING(roleId FROM -4) asserviceId FROM cbgdonedealinfo_copy ORDER BY serviceId ;

SELECT DISTINCT SUBSTRING(roleId,-4,4) asserviceId FROM cbgdonedealinfo_copy ORDER BY serviceId ;

另如何查询某个字段为空的所有记录:

SELECT * FROM cbgdonedealinfo_copy WHEREroleId IS NULL;

当然不为空的查询语句即为:

SELECT * FROM cbgdonedealinfo_copy WHEREroleId IS NOT NULL;

上面的应用若roleId为空的话,则转化后的值就为空,所以可以在将roleId为空的过滤掉不进行转化,sql语句如下:

SELECT DISTINCT SUBSTRING(roleId,-4) asserviceId FROM cbgdonedealinfo_copy WHERE roleId IS NOT NULL ORDER BY serviceId;

方法5:应用RIGHT函数

RIGHT(str,len)函数介绍:str待截取的字段或是字段具体内容,len需要截取字符长度,此函数的功能是从字段str右端开始截取长度为len的字符,即取后len位。

本题需求是取后四位,用RIGHT函数实现SQL语句如下:

SELECT DISTINCT RIGHT(roleId,4) as serviceIdfrom cbgdonedealinfo_copy;

若想取前四位则不是将len置为负数,而是对应的LEFT函数。

LEFT(str,len)截取字符前len位,用法同RIGHT(str,len)函数。

////////////////////////////////////////////////////////////////////////////////////////////

利用上面的函数可以实现批量对某个字段的值进行替换,如现在有一张表名为ServiceList的名,表结构如下:

Id

serviceName

1

笑傲江虎(五湖四海)

2

天下无双(五湖四海)

3

雄霸天下(五湖四海)

现在想把”(五湖四海)”去掉,而只保留前面的内容,可借助前面介绍的函数来实现。

UPDATE Servicelist SETserviceName=SUBSTRING_INDEX(serviceName,"(",1) WHERE serviceName LIKE'%五湖四海%'

或:UPDATE Servicelist SET serviceName=SUBSTR(serviceName,1,4) WHEREserviceName LIKE '%猛龙过江%'

*特别注意:字符串中的第一个位置始终为1,所以这里是1而不是0。

/////////////////////////////////////////////////////////////////////////////////////////////////

在上面介绍CAST和CONVERT函数的type时提到BINARY,下面将简短的介绍下BINARY。

首先BINARY不是函数,是类型转换运算符,它用来将他后面的字符或是字段强制转为一个二进制字符串,促使逐字节而不是逐字符进行列比较,可以理解为在字符串比较的时候区分大小写。如下面的查询:

Mysql> SELECT BINARY 'a' = 'A' ASCOLUMN1,'a' = 'A' AS COLUMN2;

结果如下:

COLUMN1

COLUMN2

0

1

可以看到加BINARY时区分大小写。

下面再通过一个我们经常遇到的场景来进一步介绍BINARY的用法。

首先创建一张名为binaryTest的表:

Mysql-> create TABLE testBinary (

id int(9) unsigned NOT NULL auto_increment,

userName varchar(50),

primary key (id)

)

接着,向表中插入数据:

insert into testBinary (userName) VALUES('小庄');

insert into testBinary (userName) VALUES('老炮');

insert into testBinary (userName) VALUES('高中队');

insert into testBinary (userName) VALUES('喜娃');

insert into testBinary (userName) VALUES('卫生员');

insert into testBinary (userName) VALUES('daen');

insert into testBinary (userName) VALUES('DAEN');

然后,通过like查询userName 含有daen字符的记录。

SELECT userName FROM testBinary WHEREuserName LIKE '%daen%';

得到的结果如下:

userName

daen

DAEN

这显示不是我们想要的,然而通过BINARY就能够很好解决该问题。

修改表让userName为BINARY,语句如下:

ALTER TABLE testBinary MODIFY userNameVARCHAR(50) BINARY;

然后再次做上面的查询:

SELECT userName FROM testBinary WHEREuserName LIKE '%daen%';

得到的结果为:

userName

daen

至此,如果我们想让某个字段在比较时区分大小则在建表将该字段后加BINARY进行修饰。

create TABLE testBinary (

id int(9) unsigned NOT NULL auto_increment,

userName varchar(50) BINARY not NULL DEFAULT'',

primary key (id)

)

BINARY str 是CAST(str AS BINARY)的缩略形式。即将str强制转为二进制字符串,在比较时区分大小写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: