gpt4 book ai didi

mysql - 如何将函数 substrb 从 oracle 转换为 mysql

转载 作者:行者123 更新时间:2023-11-29 18:45:58 27 4
gpt4 key购买 nike

我正在从 oracle 数据库转换为 mysql 数据库。在 Oracle 数据库中,使用函数 substrb 返回字符串的一部分,从指定字节位置开始,指定长度的字节数。

示例

select substrb(account_name,1,2) from account;

但是我在mysql中没有找到substrb
大家可以帮我转换一下或者在mysql中写函数转换一下
非常感谢。

最佳答案

您可以使用函数bit_length()返回给定字符串中的位数。将结果除以 8,得到一个字节。

这里有一些您可以使用的代码,但您可能需要构建更多检查,例如字符串长度等,以使其能够与任何给定字符串或无效参数一起使用,或者使用负数向后读取字符串参数等。

DROP FUNCTION IF EXISTS substrb;
DELIMITER $$
CREATE FUNCTION substrb(p_string varchar(255), p_start tinyint, p_len tinyint)
RETURNS varchar(255)
DETERMINISTIC
BEGIN
DECLARE v_pos_start tinyint;
DECLARE v_len tinyint;
DECLARE v_bytesRead tinyint;


SET v_pos_start = 0;
SET v_bytesRead = 0;
IF (p_start < 1) THEN
RETURN NULL;
ELSEIF (p_start = 1) THEN
SET v_pos_start := 1;
ELSE #p_start > 1
WHILE (v_bytesRead < p_start)
DO
SET v_bytesRead := v_bytesRead + (BIT_LENGTH(SUBSTR(p_string, 1 + v_pos_start, 1)) / 8);
SET v_pos_start := v_pos_start + 1;
END WHILE;
END IF;

SET v_len = 0;
SET v_bytesRead = 0;
IF (p_len < 1) THEN
RETURN NULL;
ELSEIF (p_len = 1) THEN
SET v_len := 1;
ELSE #p_start > 1
WHILE (v_bytesRead < p_len)
DO
SET v_bytesRead := v_bytesRead + (BIT_LENGTH(SUBSTR(p_string, v_pos_start + v_len, 1)) / 8);
SET v_len := v_len + 1;
END WHILE;
END IF;

RETURN SUBSTR(p_string, v_pos_start, v_len);

END $$
DELIMITER ;

使用示例:

mysql(playground) > select substrb('a x test', 1, 7);
+---------------------------+
| substrb('a x test', 1, 7) |
+---------------------------+
| a x tes |
+---------------------------+
1 row in set (0.00 sec)

mysql(playground) > select substrb('a ü test', 1, 7);
+----------------------------+
| substrb('a ü test', 1, 7) |
+----------------------------+
| a ü te |
+----------------------------+
1 row in set (0.00 sec)

mysql(playground) > select bit_length('ü');
+------------------+
| bit_length('ü') |
+------------------+
| 16 |
+------------------+
1 row in set (0.00 sec)

ü 是 2 个字节,因此结果少一个字符。

或者,使用评论中的示例:

mysql(playground) > select substr("Trần",1,4);
+----------------------+
| substr("Trần",1,4) |
+----------------------+
| Trần |
+----------------------+
1 row in set (0.00 sec)

mysql(playground) > select substrb("Trần",1,4);
+-----------------------+
| substrb("Trần",1,4) |
+-----------------------+
| Trầ |
+-----------------------+

关于mysql - 如何将函数 substrb 从 oracle 转换为 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44642567/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com