Mysql字符串处理函数小结
测试的数据库:
mysql> select * from test_tran;
+----+------------------------+
| id | name |
+----+------------------------+
| 3 | B,kiki |
| 4 | Living,Happing,Working |
+----+------------------------+
- UPPER和UCASE
返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。
select upper('name');
+---------------+
| upper('name') |
+---------------+
| NAME |
+---------------+
列表内容
LOWER和LCASE
返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。FIND_IN_SET(str,strlist)
如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。一个字符串表是被“,”分隔的子串组成的一个字符
串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为SET的列,FIND_IN_SET()函数被优化而使用位运
算!如果str不是在strlist里面或如果strlist是空字符串,返回0。如果任何一个参数是NULL,返回NULL。如果第一
个参数包含一个“,”,该函数将工作不正常。看面是二种不同的效果,可以看一下添加一条记录,
insert into test_tran value('5','kikiTsao,NBA');
,数据表变为
+----+------------------------+
| id | name |
+----+------------------------+
| 3 | B,kiki |
| 4 | Living,Happing,Working |
| 5 | kikiTsao,NBA |
+----+------------------------+
如果我们想要查找带kiki
的数据条数,如果用like模糊查询的话,会出现两条数据。
如果只确定绝对匹配‘kiki’的话,可以使用find_in_set()
字符串处理函数。
mysql> select * from test_tran where find_in_set('kiki',name);
+----+--------+
| id | name |
+----+--------+
| 3 | B,kiki |
+----+--------+
1 row in set
用模糊查询:
mysql> select * from test_tran where name like '%kiki%';
+----+--------------+
| id | name |
+----+--------------+
| 3 | B,kiki |
| 5 | kikiTsao,NBA |
+----+--------------+
2 rows in set
FIELD(str,str1,str2,str3,...)
返回str在str1, str2, str3, …清单的索引。如果str没找到,返回0。
mysql> select field('a','b','c','a');
+------------------------+
| field('a','b','c','a') |
+------------------------+
| 3 |
+------------------------+
延伸:用FIELD自定义排序
加入一个字段dept
mysql> select * from test_tran; +----+------------------------+------+ | id | name | dept | +----+------------------------+------+ | 3 | B,kiki | A | | 4 | Living,Happing,Working | A | | 5 | kikiTsao,NBA | B | | 6 | NBAkikid,KIE | C | +----+------------------------+------+ 用field自定义新的索引规则: mysql> select * from test_tran order by field(dept,'b','a','c'); +----+------------------------+------+ | id | name | dept | +----+------------------------+------+ | 5 | kikiTsao,NBA | B | | 3 | B,kiki | A | | 4 | Living,Happing,Working | A | | 6 | NBAkikid,KIE | C | +----+------------------------+------+ mysql> select field(dept,'b','a','c') from test_tran; +-------------------------+ | field(dept,'b','a','c') | +-------------------------+ | 2 | | 2 | | 1 | | 3 | +-------------------------+
ELT(N,str1,str2,str3,...)
如果N= 1,返回str1,如果N= 2,返回str2,等等。
如果N小于1或大于参数个数,返回NULL。ELT()是FIELD()反运算。
mysql> select elt(2,'b','c','a');
+--------------------+
| elt(2,'b','c','a') |
+--------------------+
| c |
+--------------------+
mysql> select id,name,elt(1,id,name,dept) from test_tran;
+----+------------------------+---------------------+
| id | name | elt(1,id,name,dept) |
+----+------------------------+---------------------+
| 3 | B,kiki | 3 |
| 4 | Living,Happing,Working | 4 |
| 5 | kikiTsao,NBA | 5 |
| 6 | NBAkikid,KIE | 6 |
+----+------------------------+---------------------+
REPLACE(str,from_str,to_str)
返回字符串str,其字符串from_str的所有出现由字符串to_str代替。SUBSTRING(str FROM pos)
从字符串str的起始位置pos返回一个子串。mysql数据库的下标是从1开始的。
mysql> select substring('I love you!' from 1 for 4);
mysql> select substring('I love you!', 1,4);
+---------------------------------------+
| substring('I love you!' from 1 for 4) |
+---------------------------------------+
| I lo |
+---------------------------------------+
mysql> select substring('I love you!', 0,4);
+-------------------------------+
| substring('I love you!', 0,4) |
+-------------------------------+
| |
+-------------------------------+
SUBSTRING_INDEX(str,delim,count)
返回从字符串str的第count个出现的分隔符delim之后的子串。
如果count是正数,返回最后的分隔符到左边(从左边数) 的所有字符。如果count是负数,
返回最后的分隔符到右边的所有字符(从右边数)。 从左找到第一个为,的位置,并取左侧的字符。
mysql> select substring_index("ni,hao,ma",',',1);
+------------------------------------+
| substring_index("ni,hao,ma",',',1) |
+------------------------------------+
| ni |
+------------------------------------+
从右找到第一个为,的位置,并取右侧的字符。
mysql> select substring_index("ni,hao,ma",',',-1);
+-------------------------------------+
| substring_index("ni,hao,ma",',',-1) |
+-------------------------------------+
| ma |
+-------------------------------------+
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
返回字符串str,其所有remstr前缀或后缀被删除了。
如果没有修饰符BOTH、LEADING或TRAILING给出,BOTH被假定。如果remstr没被指定,空格被删除。
默认是去除空格,制定remstr之后,会去除指定字符。LEADING和TRAILING表示去除字符串前或者的指定字符。
mysql> select trim('a' from 'adegrga');
+--------------------------+
| trim('a' from 'adegrga') |
+--------------------------+
| degrg |
+--------------------------+
mysql> select trim(leading 'a' from 'adegrga');
+----------------------------------+
| trim(leading 'a' from 'adegrga') |
+----------------------------------+
| degrga |
+----------------------------------+
- 字符串连接函数
CONCAT/CONCAT_WS/GROUP_CONCAT
是在多字段查询的时候了解了这个函数。
多字段查询:
select 字段 from 表名 where CONCAT(要查询的字段1,字段2) LIKE '%查询字符%';
就可以查到指定字段1和字段2在内的匹配的字段。
CONCAT是直接连接
mysql> select concat('fdsaf','fwerwer');
+---------------------------+
| concat('fdsaf','fwerwer') |
+---------------------------+
| fdsaffwerwer |
+---------------------------+
CONCAT_WS是通过一个分隔符连接
mysql> select concat_WS(',','dfd','fere');
+-----------------------------+
| concat_WS(',','dfd','fere') |
+-----------------------------+
| dfd,fere |
+-----------------------------+
GROUP_CONCAT会通过group by 分组之后,把想要的字段连接起来,用逗号分隔。
mysql> select group_concat(name) from base_op group by test_col;
+--------------------+
| group_concat(name) |
+--------------------+
| weiwei,fefge |
| kiki |
+--------------------+
自己觉得常用的写在这了,其他请参看博文http://blog.51yip.com/mysql/965.html#