TRANSLATE
描述
TRANSLATE 函数用于字符串替换,将源字符串中的字符按照映射规则进行逐字符转换。该函数会将源字符串中出现在 from 字符串中的每个字符替换为 to 字符串中对应位置的字符。
语法
TRANSLATE(<source>, <from>, <to>)
参数
| 参数 | 说明 |
|---|---|
<source> | 需要进行转换的源字符串。类型:VARCHAR |
<from> | 要被替换的字符集合,定义映射规则的源字符。类型:VARCHAR |
<to> | 替换后的字符集合,定义映射规则的目标字符。类型:VARCHAR |
返回值
返回 VARCHAR 类型,表示按照字符映射规则转换后的字符串。
字符映射规则:
- 按照 from 和 to 字符串的位置建立一对一的字符映射关系
- from 第1个字符映射到 to 第1个字符,from 第2个字符映射到 to 第2个字符,依此类推
- 如果 from 字符串中有重复字符,优先使用第一次出现的映射规则,忽略后续重复出现的字符
- 源字符串中不在 from 字符串中的字符保持不变
特殊情况:
- 如果任意参数为 NULL,返回 NULL
- 如果 source 为空字符串,返回空字符串
- 如果 from 为空字符串,返回原 source 字符串
- 如果 to 为空字符串,删除 source 中所有在 from 中出现的字符
- 如果 to 字符串长度小于 from,超出部分的 from 字符在 source 中会被删除
示例
- 基本字符替换
SELECT TRANSLATE('abcd', 'a', 'z');
+-----------------------------+
| TRANSLATE('abcd', 'a', 'z') |
+-----------------------------+
| zbcd |
+-----------------------------+
- 源字符串中每次出现都会被替换
SELECT TRANSLATE('abcda', 'a', 'z');
+------------------------------+
| TRANSLATE('abcda', 'a', 'z') |
+------------------------------+
| zbcdz |
+------------------------------+
- 多字符映射(按位置一一对应)
SELECT TRANSLATE('abcd', 'ac', 'zx');
+-------------------------------+
| TRANSLATE('abcd', 'ac', 'zx') |
+-------------------------------+
| zbxd |
+-------------------------------+
<from>中存在重复字符时只使用第一次映射
SELECT TRANSLATE('abacad', 'aac', 'zxy');
+-----------------------------------+
| TRANSLATE('abacad', 'aac', 'zxy') |
+-----------------------------------+
| zbzyzd |
+-----------------------------------+
<to>比<from>短时多余字符被删除
SELECT TRANSLATE('abcde', 'ace', 'xy');
+---------------------------------+
| TRANSLATE('abcde', 'ace', 'xy') |
+---------------------------------+
| xbyd |
+---------------------------------+
- NULL 值处理 —— 任一参数为 NULL 时返回 NULL
SELECT TRANSLATE(NULL, 'a', 'z'), TRANSLATE('abc', NULL, 'z'), TRANSLATE('abc', 'a', NULL);
+---------------------------+-----------------------------+-----------------------------+
| TRANSLATE(NULL, 'a', 'z') | TRANSLATE('abc', NULL, 'z') | TRANSLATE('abc', 'a', NULL) |
+---------------------------+-----------------------------+-----------------------------+
| NULL | NULL | NULL |
+---------------------------+-----------------------------+-----------------------------+
- 空字符串边界 —— source 为空返回空,
<from>为空返回原 source,<to>为空则删除被匹配的字符
SELECT TRANSLATE('', 'a', 'z'), TRANSLATE('abc', '', 'z'), TRANSLATE('abc', 'a', '');
+-------------------------+---------------------------+---------------------------+
| TRANSLATE('', 'a', 'z') | TRANSLATE('abc', '', 'z') | TRANSLATE('abc', 'a', '') |
+-------------------------+---------------------------+---------------------------+
| | abc | bc |
+-------------------------+---------------------------+---------------------------+
- UTF-8 多字节字符
SELECT TRANSLATE('ṭṛì ḍḍumai', 'ṭṛ', 'ab');
+--------------------------------------------------+
| TRANSLATE('ṭṛì ḍḍumai', 'ṭṛ', 'ab') |
+--------------------------------------------------+
| abì ḍḍumai |
+--------------------------------------------------+
- 数字字符替换
SELECT TRANSLATE('a1b2c3', '123', 'xyz');
+-----------------------------------+
| TRANSLATE('a1b2c3', '123', 'xyz') |
+-----------------------------------+
| axbycz |
+-----------------------------------+
- 两侧都含重复字符的复杂映射
SELECT TRANSLATE('aabbccaa', 'abab', 'xyuv');
+---------------------------------------+
| TRANSLATE('aabbccaa', 'abab', 'xyuv') |
+---------------------------------------+
| xxyyccxx |
+---------------------------------------+
- 特殊符号替换
SELECT TRANSLATE('hello@world.com', '@.', '-_');
+------------------------------------------+
| TRANSLATE('hello@world.com', '@.', '-_') |
+------------------------------------------+
| hello-world_com |
+------------------------------------------+