在MYSQL中,我们会遇到在某个字符串中查找指定的某个或几个字符,一般情况下,我们可以通过LIKE模糊查询来实现查找过程,那还有没有其他函数也能实现类似的查找功能呢?下面我们来看看有类似功能的几个函数吧。本文主要测试了LOCATE函数的用法。
一、LOCATE、POSITION、INSTR函数介绍1、LOCATE函数LOCATE(substr,str)
该函数表示返回字符串 str中子字符串substr的第一个出现位置;如若substr 不在str中,则返回值为0。
LOCATE(substr,str,pos)
该函数表示返回字符串 str中子字符串substr的第一个出现位置, 起始位置在pos。如若substr
不在str中,则返回值为0。
2、POSITION函数
POSITION(substr IN str)
该函数表示返回字符串 str中子字符串substr的第一个出现位置;如若substr 不在str中,则返回值为0。
3、INSTR函数
INSTR(str,substr)
该函数表示返回字符串 str中子字符串substr的第一个出现位置;如若substr
不在str中,则返回值为0。这和LOCATE()的双参数形式相同,只是参数的顺序被颠
倒。
注意:这个函数支持多字节字元,并且只有当至少有一个参数是二进制字符串时区分大小写。
二、测试示例
1、创建测试表
DROP TABLE IF EXISTS t_buffer_test;
CREATE TABLE `t_buffer_test` (
`buffer` varchar(1000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2、插入测试数据
INSERT INTO t_buffer_test VALUES('15270874736 18754789638
18901456889')
3、利用函数查询处理
select LOCATE(' ',buffer) from t_buffer_test;
------
12
select POSITION(' ' IN buffer) from t_buffer_test;
------
12
select INSTR(buffer,' ') from t_buffer_test;
------
12
4、利用函数分隔数据
SELECT SUBSTR(buffer,1,LOCATE(' ',buffer)) from
t_buffer_test;
------
15270874736
5、利用函数结合循环分隔数据
DROP PROCEDURE IF EXISTS pr_fun_test;
CREATE PROCEDURE pr_fun_test()
proc_start:BEGIN
DROP table IF EXISTS t_buffer_tmp;
CREATE TABLE t_buffer_tmp(buffer VARCHAR(20) UNIQUE);
SELECT buffer into @buffer from
t_buffer_test;
WHILE LOCATE(',',@buffer)>0
DO
SET @user_tel =
SUBSTRING(@buffer,1,LOCATE(',',@buffer)-1);
INSERT INTO t_buffer_tmp
SELECT @user_tel;
SET
@buffer=SUBSTRING(@buffer,LOCATE(',',@buffer)+1,(LENGTH(@buffer)-LOCATE(',',@buffer)));
END WHILE;
INSERT INTO t_buffer_tmp
select @buffer;
END
SELECT * FROM t_buffer_tmp;
---------------------------
15270874736
18754789638
18901456889