MSSQL 和 Mysql 切割字符串 自定义函数与存储过程
2008-08-29 08:33
1241 查看
2008-07-24 17:43
mysql和mssql自定义都不带切割字符串的函数,例如在输入
(A,B,C),
我们需要得出一个列
数据
A
B
C
这在系统自己种并不包含,需要自定义函数,先看看MSSQL的自定义函数:
CREATE function StrSplit(@c varchar(2000),@split varchar(2)=',')
returns @t table(col varchar(100))
as
begin
while(charindex(@split,@c)<>0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),'')
end
insert @t(col) values (@c)
return
end
GO
使用的时候
select * from dbo.StrSplit('52,50,55',','))
即可。
在MYSQL里面,我也希望能用自定义函数,但是,目前的版本并不支持返回table这种类型的函数,所以不得不考虑使用存储过程。
首先,了解mysql创建临时表的语句:
set global log_bin_trust_function_creators = 1;
DELIMITER $$
DROP FUNCTION IF EXISTS `Myf`$$
CREATE DEFINER=`root`@`%` FUNCTION `Myf`() RETURNS varchar(50) CHARSET utf8
begin
return concat('-FUNCTION');
end$$
DELIMITER ;
然后看看使用:
SELECT Myf('MYF?');
然后是存储过程:
DELIMITER //
DROP PROCEDURE IF EXISTS split_string //
CREATE PROCEDURE split_string (
IN input VARCHAR(2000)
, IN `delimiter` VARCHAR(10)
)
SQL SECURITY INVOKER
COMMENT
'Splits a supplied string using using the given delimiter,
placing values in a temporary table'
BEGIN
DECLARE cur_position INT DEFAULT 1 ;
DECLARE remainder VARCHAR(2000);
DECLARE cur_string VARCHAR(1000);
DECLARE delimiter_length TINYINT UNSIGNED;
DROP TEMPORARY TABLE IF EXISTS SplitValues;
CREATE TEMPORARY TABLE SplitValues (
value VARCHAR(1000) NOT NULL PRIMARY KEY
) ENGINE=MyISAM;
SET remainder = input;
SET delimiter_length = CHAR_LENGTH(delimiter);
WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
SET cur_position = INSTR(remainder, `delimiter`);
IF cur_position = 0 THEN
SET cur_string = remainder;
ELSE
SET cur_string = LEFT(remainder, cur_position - 1);
END IF;
IF TRIM(cur_string) != '' THEN
INSERT INTO SplitValues VALUES (cur_string);
END IF;
SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
END WHILE;
END //
DELIMITER ;
/*
Tests
*/
CALL split_string('Steve,Jan,Bobby,Jay,Kaj,Colin',',');
SELECT * FROM SplitValues;
CREATE TEMPORARY TABLE TestJoin (join_field VARCHAR(20) PRIMARY KEY) ENGINE=MEMORY;
INSERT INTO TestJoin VALUES ('Kaj'),('Colin');
SELECT tj.* FROM TestJoin tj
INNER JOIN SplitValues sv
ON tj.join_field = sv.value;
//这个代码来自MYSQL官方,我没有验证
mysql和mssql自定义都不带切割字符串的函数,例如在输入
(A,B,C),
我们需要得出一个列
数据
A
B
C
这在系统自己种并不包含,需要自定义函数,先看看MSSQL的自定义函数:
CREATE function StrSplit(@c varchar(2000),@split varchar(2)=',')
returns @t table(col varchar(100))
as
begin
while(charindex(@split,@c)<>0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),'')
end
insert @t(col) values (@c)
return
end
GO
使用的时候
select * from dbo.StrSplit('52,50,55',','))
即可。
在MYSQL里面,我也希望能用自定义函数,但是,目前的版本并不支持返回table这种类型的函数,所以不得不考虑使用存储过程。
首先,了解mysql创建临时表的语句:
set global log_bin_trust_function_creators = 1;
DELIMITER $$
DROP FUNCTION IF EXISTS `Myf`$$
CREATE DEFINER=`root`@`%` FUNCTION `Myf`() RETURNS varchar(50) CHARSET utf8
begin
return concat('-FUNCTION');
end$$
DELIMITER ;
然后看看使用:
SELECT Myf('MYF?');
然后是存储过程:
DELIMITER //
DROP PROCEDURE IF EXISTS split_string //
CREATE PROCEDURE split_string (
IN input VARCHAR(2000)
, IN `delimiter` VARCHAR(10)
)
SQL SECURITY INVOKER
COMMENT
'Splits a supplied string using using the given delimiter,
placing values in a temporary table'
BEGIN
DECLARE cur_position INT DEFAULT 1 ;
DECLARE remainder VARCHAR(2000);
DECLARE cur_string VARCHAR(1000);
DECLARE delimiter_length TINYINT UNSIGNED;
DROP TEMPORARY TABLE IF EXISTS SplitValues;
CREATE TEMPORARY TABLE SplitValues (
value VARCHAR(1000) NOT NULL PRIMARY KEY
) ENGINE=MyISAM;
SET remainder = input;
SET delimiter_length = CHAR_LENGTH(delimiter);
WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
SET cur_position = INSTR(remainder, `delimiter`);
IF cur_position = 0 THEN
SET cur_string = remainder;
ELSE
SET cur_string = LEFT(remainder, cur_position - 1);
END IF;
IF TRIM(cur_string) != '' THEN
INSERT INTO SplitValues VALUES (cur_string);
END IF;
SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
END WHILE;
END //
DELIMITER ;
/*
Tests
*/
CALL split_string('Steve,Jan,Bobby,Jay,Kaj,Colin',',');
SELECT * FROM SplitValues;
CREATE TEMPORARY TABLE TestJoin (join_field VARCHAR(20) PRIMARY KEY) ENGINE=MEMORY;
INSERT INTO TestJoin VALUES ('Kaj'),('Colin');
SELECT tj.* FROM TestJoin tj
INNER JOIN SplitValues sv
ON tj.join_field = sv.value;
//这个代码来自MYSQL官方,我没有验证
相关文章推荐
- MSSQL 和 Mysql 切割字符串 自定义函数与存储过程
- MySQL存储过程和自定义函数、Navicat、创建存储过程和函数、调用存储过程和函数、三种方式、In和Out类型参数、
- MYSQL 存储过程与自定义函数的区别
- mysql创建自定义函数与存储过程
- Mysql 存储过程之函数-如判断两个以逗号分隔字符串的包含关系
- 4)mysql自定义函数和存储过程
- mysql 自定义函数与自定义存储过程的调用方法
- 深入mysql创建自定义函数与存储过程的详解
- mysql的存储过程与自定义函数
- 深入mysql创建自定义函数与存储过程的详解
- MySQL 第八篇:自定义函数、存储过程、游标
- 初学mysql(十)-数据库之存储过程、函数与游标-自定义函数和流程控制(下)
- mysql存储过程和函数(二)——简单自定义函数
- mysql存储过程和函数(三)——存储过程和自定义函数示例,大批量测试数据的插入
- MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别
- 【MySql】 MySQL存储过程常用的函数(字符串类型操作,数学类,日期时间类)
- mysql存储过程统计切割字符串之后的字段数
- (9)mysql中的存储过程和自定义函数
- MySQL存储过程常用的函数(字符串类型操作,数学类,日期时间类)
- MySQL自定义函数与存储过程