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

时间:2017-06-20 01:53:06

标签: mysql oracle

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

实施例

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

但我在mysql中找不到substrb 每个人都可以帮我转换它或在mysql中编写函数来转换它 非常感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用函数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ầ                   |
+-----------------------+