在存储过程中,传入的参数经常可能会有数组,而mysql没有自带处理数组的方法或函数。
需求是这样的:
传入数组形如:【aaa|bbb|ccc】
返回值形如:【aaa】、【bbb】、【ccc】
自己写了一个自定义函数来完成上述需求:
使用例子:
其中传入的值有三个:
第一个是要处理的数组,
第二个是数组内元素与元素的分隔符,比如 | /
第三个是要取出的元素索引,比如,0为第一个元素,1为第二个元素,以此类推,若输入的索引 没有值,则返回上越界或下越界
FUN_GET_ELEMENT函数定义:
上述UDF调用了 另外 一个函 数FUN_GET_COUNT(), 这一个 函 数 同样也是自定义的。
用于获取传入的字符串数组的最大索引(元素数目-1)。
该函数使用例子:
FUN_GET_COUNT 函数定义:
(当然也可以将两个UDF 合并 在一起。)
在存储过程中使用起来也是十分方便:
数组默认为字符串数组,若为数值数组,则可在最后返回值通过系统函 数CONVERT()转换。
测试上述procedure:
作者公众号(持续更新)
需求是这样的:
传入数组形如:【aaa|bbb|ccc】
返回值形如:【aaa】、【bbb】、【ccc】
自己写了一个自定义函数来完成上述需求:
使用例子:
- mysql> select FUN_GET_ELEMENT('第一个|第二个|第三个', '|', -1);
- +------------------------------------------------------------------------------+
- | FUN_GET_ELEMENT('第一个|第二个|第三个', '|', -1) |
- +------------------------------------------------------------------------------+
- | 上越界 |
- +------------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
- mysql> select FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 0);
- +------------------------------------------------------------------------------+
- | FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 0) |
- +------------------------------------------------------------------------------+
- | 第一个 |
- +------------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
- mysql> select FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 1);
- +-----------------------------------------------------------------------------+
- | FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 1) |
- +-----------------------------------------------------------------------------+
- | 第二个 |
- +-----------------------------------------------------------------------------+
- 1 row in set (0.01 sec)
- mysql> select FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 2);
- +-----------------------------------------------------------------------------+
- | FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 2) |
- +-----------------------------------------------------------------------------+
- | 第三个 |
- +-----------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
- mysql> select FUN_GET_ELEMENT('第一个/第二个/第三个', '/', 5);
- +-----------------------------------------------------------------------------+
- | FUN_GET_ELEMENT('第一个/第二个/第三个', '/', 5) |
- +-----------------------------------------------------------------------------+
- | 下越界 |
- +-----------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
其中传入的值有三个:
第一个是要处理的数组,
第二个是数组内元素与元素的分隔符,比如 | /
第三个是要取出的元素索引,比如,0为第一个元素,1为第二个元素,以此类推,若输入的索引 没有值,则返回上越界或下越界
FUN_GET_ELEMENT函数定义:
- DROP FUNCTION IF EXISTS FUN_GET_ELEMENT;
-
- delimiter ;;
-
- CREATE FUNCTION `FUN_GET_ELEMENT`(
- `mainstring` varchar(1024) CHARSET utf8,
- `mark` varchar(4) CHARSET utf8,
- `count` int
- )
- RETURNS varchar(65) CHARSET utf8
-
- BEGIN
-
- DECLARE v_string varchar(1024) CHARSET utf8 DEFAULT mainstring;
- DECLARE v_element varchar(64) CHARSET utf8;
- DECLARE i int DEFAULT 0;
-
- IF(count > 0 and count <= FUN_GET_COUNT(mainstring, mark)) THEN
-
- WHILE(i < count) DO
-
- SET v_string = SUBSTRING(v_string, INSTR(v_string, mark) + 1, CHAR_LENGTH(v_string));
- SET i = i + 1;
-
- END WHILE;
-
- END IF;
-
- IF(count < 0) THEN
-
- SET v_element = '上越界';
-
- ELSEIF (count < FUN_GET_COUNT(mainstring, mark)) THEN
-
- SET v_element = SUBSTRING(v_string, 1, INSTR(v_string, mark) - 1);
-
- ELSEIF (count = FUN_GET_COUNT(mainstring, mark)) THEN
-
- SET v_element = v_string;
-
- ELSE
-
- SET v_element = '下越界';
-
- END IF;
-
- RETURN(v_element);
-
- END;;
-
- delimiter ;
上述UDF调用了 另外 一个函 数FUN_GET_COUNT(), 这一个 函 数 同样也是自定义的。
用于获取传入的字符串数组的最大索引(元素数目-1)。
该函数使用例子:
- mysql> select FUN_GET_COUNT('a|b|c','|');
- +----------------------------+
- | FUN_GET_COUNT('a|b|c','|') |
- +----------------------------+
- | 2 |
- +----------------------------+
- 1 row in set (0.00 sec)
FUN_GET_COUNT 函数定义:
- DROP FUNCTION IF EXISTS FUN_GET_COUNT;
-
- delimiter ;;
-
- CREATE FUNCTION `FUN_GET_COUNT`(
- `mainstring` varchar(1024) CHARSET utf8,
- `mark` varchar(200) CHARSET utf8
- ) RETURNS int
-
- BEGIN
-
- DECLARE i int;
-
- SET i = (CHAR_LENGTH(mainstring) - CHAR_LENGTH(REPLACE(mainstring, mark, ''))) / CHAR_LENGTH(mark);
-
- RETURN i;
-
- END;;
-
- delimiter ;
(当然也可以将两个UDF 合并 在一起。)
在存储过程中使用起来也是十分方便:
- DROP PROCEDURE IF EXISTS PROC_TEST;
-
- delimiter ;;
-
- CREATE PROCEDURE `PROC_TEST`(
- `text` varchar(64) CHARSET utf8
- )
-
- BEGIN
-
- DECLARE v_text varchar(64) CHARSET utf8 DEFAULT text;
- DECLARE v_element varchar(16) CHARSET utf8;
- DECLARE v_element_count int DEFAULT 0;
- DECLARE i int DEFAULT 0;
-
- IF LENGTH(text) > 0 THEN
-
- SET v_element_count = FUN_GET_COUNT(v_text, '|');
-
- WHILE (i <= v_element_count) DO
-
- SET v_element = FUN_GET_ELEMENT(v_text, '|', i);
- SELECT v_element;
- SET i = i + 1;
-
- END WHILE;
-
- END IF;
-
- END;;
-
- delimiter ;
数组默认为字符串数组,若为数值数组,则可在最后返回值通过系统函 数CONVERT()转换。
- mysql> SELECT CONVERT('1', SIGNED);
- +----------------------+
- | CONVERT('1', SIGNED) |
- +----------------------+
- | 1 |
- +----------------------+
- 1 row in set (0.00 sec)
测试上述procedure:
- mysql> CALL PROC_TEST('test1|test2');
- +-----------+
- | v_element |
- +-----------+
- | test1 |
- +-----------+
- 1 row in set (0.00 sec)
-
- +-----------+
- | v_element |
- +-----------+
- | test2 |
- +-----------+
- 1 row in set (0.00 sec)
-
- Query OK, 0 rows affected (0.00 sec)
作者公众号(持续更新)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29773961/viewspace-1850718/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29773961/viewspace-1850718/