TRANSLATE 标量函数 (scalar function)
TRANSLATE函数返回的值中,第一个参数的一个或多个字符可能被转换为其他字符。
该模式是 SYSIBM。
- 字符串表达式
- 指定要转换的字符串的表达式。 字符串表达式必须返回一个值,该值是内置字符或图形字符串数据类型,且不是LOB。 如果字符串表达式是EBCDIC或ASCII图形字符串,并且字符串表达式是唯一指定的参数,则由CURRENT LOCALE LC_CTYPE特殊寄存器指定的区域设置名称必须是非空字符串。
该参数也可以是数字数据类型。 数字参数将隐式强制转换为 VARCHAR 数据类型。
- 成串
- 一个表达式,用于指定字符串表达式中的某些字符要转换为哪些字符。 该字符串有时被称为输出转换表。 to-string 必须返回一个非LOB的内置字符或图形字符串数据类型。
该参数也可以是数字数据类型。 数字参数将隐式强制转换为 VARCHAR 数据类型。
如果 to-string 的长度小于 from-string 的长度,则用垫片或空白将to-string 补足到 from-string的长度。 如果 to-string 的长度大于 from-string , to-string中的多余字符将被忽略,且不会发出警告。
- 从字符串
- 一个表达式,用于指定字符串表达式中需要转换的字符。 该字符串有时被称为输入转换表。 当找到字符串中的字符时, 字符串表达式中的字符将转换为字符串中的字符,该字符位于字符串表达式中字符的对应位置。
from-string 必须返回一个值,该值是内置字符或图形字符串数据类型,且不是LOB。
该参数也可以是数字数据类型。 数字参数将隐式强制转换为 VARCHAR 数据类型。
如果字符串中包含重复字符,则使用第一个出现的字符,且不会发出警告。 from-string 的默认值是一个以字符 X'00' 开头、以字符X'FF' (十进制255)结尾的字符串。
- pad
- 一个表达式,用于指定字符,如果字符串长度小于字符串 ,则用该字符填充字符串。 pad 是一个必须返回一个值的表达式,该值是内置字符或图形字符串数据类型,不是 LOB,长度为 1。 字符串的长度为1时,表示一个字节,图形字符串的长度为1时,表示两个字节。 默认值为空,适用于字符串表达式。
如果仅指定了字符串表达式 ,则字符串将根据当前区域设置 LC_CTYPE 特殊寄存器指定的区域设置名称转换为大写,如下所示:
- 空白
- SBCS小写字母a-z转换为SBCS大写字母A-Z,带变音符号的字符不转换。 如果字符串包含混合字符或双字节字符,则全角小写字符 a-z 会转换为全角拉丁文大写字符 A-Z。 为了获得最佳性能,请指定一个空字符串,除非您的数据必须使用特定区域设置的规则进行处理。
- UnI
- 转换使用 “选择转换”中所述的“正常”和“特殊”外壳功能。 当字符串表达式为EBCDIC数据时,请勿指定UNI。
UNI_90
转换使用Unicode标准 9.0.0 和NORMAL大小写功能,如 “选择转换”中所述。 当字符串表达式为EBCDIC数据时,请勿指定 UNI_60。
UNI_90
转换使用Unicode标准 6.0.0 和NORMAL大小写功能,如 “选择转换”中所述。 当字符串表达式为EBCDIC数据时,请勿指定 UNI_90。
- UNI_SIMPLE
- 案例转换使用 “选择转换”中所述的NORMAL格式。 UNI_SIMPLE不能用于EBCDIC数据。
- 语言环境名称
- 区域设置定义了转换为大写字符的规则。
对于Unicode数据,如果处理某些字符,使用TRANSLATE函数(带一个参数的TRANSLATE函数等同于UPPER函数)可能会导致扩展。 您应该确保结果字符串足够大,能够容纳表达式的结果。
如果指定了多个参数,则结果字符串将逐个从字符串表达式中构建。 如果字符串表达式为CHAR或VARCHAR,则一个字符串的长度为一个字节。 如果字符串表达式为图形或变图形,则一个字符串的长度为两个字节。 
对于字符串表达式中的每个部分,都会在from-string中搜索相同的部分。 

- 如果字符串表达式中的片段与字符串中的片段匹配,并且字符串中的片段与字符串中的片段匹配,则字符串中的片段将移动到结果字符串中。 如果字符串表达式中的片段与从字符串中的片段匹配,但到字符串中没有对应的片段,则将垫片移动到结果字符串中。
- 如果字符串表达式中的片段与从字符串中的任何片段不匹配,则字符串表达式中的片段将移动到结果字符串中。

字符串可以包含混合数据。 如果只指定了一个参数,则对参数执行 UPPER 函数,并遵守 UPPER 函数中混合数据操作规则。 全角拉丁文小写字母a-z转换为全角拉丁文大写字母A-Z。 如果指定了多个参数,则函数将按照前面描述的 CHAR 和 VARCHAR 数据操作。 结果不一定是正确形成的混合数据字符串。
结果的编码方案与字符串表达式相同。 函数结果的数据类型取决于字符串表达式 、to-string 、from-string 和 pad 的数据类型:
- 如果字符串表达式是一个字符串,则为VARCHAR。 结果的CCSID取决于参数:
- 如果字符串表达式 、to-string 、from-string 或 pad 是位数据,则结果也是位数据。
- 如果字符串表达式、 字符串转换、 字符串转换和填充都是SBCS:
- 如果字符串表达式、 转换为字符串 、从字符串和填充都是SBCS Unicode数据,则结果的CCSID就是SBCS Unicode数据的CCSID。
- 如果字符串表达式是SBCS Unicode数据,而 to-string 、from-string 或 pad 不是SBCS Unicode数据,则结果的CCSID是Unicode数据的混合CCSID。
- 否则,结果的CCSID与字符串表达式的 CCSID相同。
- 否则,结果的CCSID是字符串表达式的CCSID 对应的混合CCSID。 但是,如果输入是EBCDIC或ASCII,并且没有相应的混合系统CCSID,则结果的CCSID是字符串表达式的 CCSID。
- VARGRAPHIC 如果字符串表达式是一个图形。 结果的CCSID与源字符串的CCSID相同。
结果可以为空;如果第一个参数为空,则结果为空值。
示例
- 示例 1
- 用大写字母返回字符串“abcdef”。 假设当前区域设置是空白的。
结果为“ABCDEF”。SELECT TRANSLATE ('abcdef') FROM SYSIBM.SYSDUMMY1 - 示例 2
- 假设宿主变量 SITE 的数据类型为 VARCHAR(30),且包含字符串“Hanauma Bay”。
返回值“HANAUMA BAY”。 结果为全大写,因为只指定了一个参数。SELECT TRANSLATE (:SITE) FROM SYSIBM.SYSDUMMY1
返回值“Hanauma jay”。SELECT TRANSLATE (:SITE, 'j', 'B') FROM SYSIBM.SYSDUMMY1
返回值“Heneume Bey”。SELECT TRANSLATE (:SITE, 'ei', 'aa') FROM SYSIBM.SYSDUMMY1
返回值 'HAnAumA bA%'。SELECT TRANSLATE (:SITE, 'bA', 'Bay', '%') FROM SYSIBM.SYSDUMMY1
返回值“Hana ma ray”。SELECT TRANSLATE (:SITE, 'r', 'Bu') FROM SYSIBM.SYSDUMMY1 - 示例 3
- 假设宿主变量 SITE 的数据类型为VARCHAR(30),且包含“Pivabiska Lake Place”。
返回值“Pivabiska $ake P$ace”。SELECT TRANSLATE (:SITE, '$$', 'Ll') FROM SYSIBM.SYSDUMMY1
返回值 'pivAbiskA LAk。 pLA..'.SELECT TRANSLATE (:SITE, 'pLA', 'Place', '.') FROM SYSIBM.SYSDUMMY1
