LOWER 标量函数 (scalar function)
LOWER函数返回一个字符串,其中所有字符都转换为小写字符。
该模式是 SYSIBM。
- 字符串表达式
- 指定要转换的字符串的表达式。 字符串表达式必须返回一个内置字符或图形字符串。 字符串参数不能是CLOB,图形字符串参数不能是DBCLOB。 如果字符串表达式是EBCDIC图形字符串,则不能为区域设置名称字符串指定空字符串。 如果字符串表达式是位数据,则不能指定区域设置名称字符串。
该参数也可以是数字数据类型。 数字参数将隐式强制转换为 VARCHAR 数据类型。
- 本地化名称字符串
- 一个字符串常量或字符串宿主变量,指定一个有效的区域设置名称,但CLOB或DBCLOB除外。 如果区域设置名称字符串不是EBCDIC格式,则将其转换为EBCDIC格式。 区域设置名称字符串的长度必须在EBCDIC表示法的1-255字节范围内。 区域设置名称字符串不区分大小写,且必须为有效的区域设置。 有关本地化及其命名约定,请参阅 《动态链接库(DLL)的构建和使用 》。 一些地区包括:
- Fr_BE
- Fr_FR@EURO
- En_US
- Ja_JP
转换过程取决于为区域设置名称指定的值,如下所示:
- 空白
- SBCS中的大写字母A-Z转换为SBCS中的小写字母a-z,带变音符号的字符则不转换。 如果字符串包含混合字符或双字节字符,全角拉丁文大写字母A-Z将转换为全角小写字母a-z。 为了获得最佳性能,请指定一个空字符串,除非您的数据必须使用特定区域设置的规则进行处理。
- UnI
- 转换使用 “选择转换”中所述的“正常”和“特殊”外壳功能。 当字符串表达式为EBCDIC数据时,请勿指定UNI。
UNI_60
转换使用Unicode标准 6.0.0 和NORMAL大小写功能,如 “选择转换”中所述。 当字符串表达式为EBCDIC数据时,请勿指定 UNI_60。
UNI_90
转换使用Unicode标准 9.0.0 和NORMAL大小写功能,如 “选择转换”中所述。 当字符串表达式为EBCDIC数据时,请勿指定 UNI_90。
- UNI_SIMPLE
- 案例转换使用 “选择转换”中所述的NORMAL格式。 UNI_SIMPLE不能用于EBCDIC数据。
- 语言环境名称
- 区域设置定义了转换为小写字符的规则。
宿主变量的值不能为空。 如果宿主变量有一个关联的指示变量,指示变量的值不能为空。 区域设置名称必须为:
- 在宿主变量中左对齐
- 如果长度小于宿主变量的长度,则右侧用空格填充,宿主变量为固定长度的字符或图形数据类型
如果未指定区域设置名称字符串 ,则区域设置由特殊寄存器CURRENT LOCALE LC_CTYPE确定。 有关特殊注册的信息,请参阅当前区域 LC_CTYPE 特殊注册。 然而,如果索引引用了LOWER函数,则本地索引的确定顺序如下(按顺序):
- 在准备时间:使用当前区域 LC_CTYPE 特殊寄存器中的值
- 绑定时:使用安装面板 DSNTIPF 中 LOCALE LC_CTYPE 字段中的值
如果在访问路径中选择索引,则运行时、准备或绑定时,CURRENT LOCALE LC_CTYPE 特殊寄存器中的区域设置必须保持不变。 为了避免这种依赖,请不要省略区域设置名称字符串。
如果在基于表达式的索引中引用了 LOWER 函数,则必须指定区域设置名称字符串。 请参阅示例部分,了解如何在查询中使用索引。
- 整数
- 指定结果长度属性的整数值。 如果指定,则整数必须是字符串表达式编码方案表示法中1-32704字节范围内的整数常量。
如果未指定整数 ,则结果的长度属性与字符串表达式的长度相同。
对于Unicode数据,如果处理某些字符,使用LOWER函数可能会导致扩展。 例如,LOWER ('Ì') —UX'00CC'—— 将生成 UX'006903070300' (如果LT_LT区域设置当时有效)。 您应该确保结果的长度足以容纳表达式的结果。
结果可以为空值;如果参数为空值,那么结果为空值。
注意
- 语法替代方案:
- LCASE是LOWER的同义词。 为了符合SQL标准,应该使用LOWER。
示例
- 示例 1:
- 将主机变量NAME的值中的字符全部转换为小写。 NAME的数据类型为VARCHAR(30),值为“Christine Smith”。 假设当前区域设置是空白的。
结果就是“克里斯汀·史密斯”这个值。SELECT LCASE(:NAME) FROM SYSIBM.SYSDUMMY1; - 示例 2:
- 返回小写的“Ì”。 假设当前区域设置为LT_LT。
由于某些Unicode字符在处理时会发生扩展,因此会产生错误。 为了避免错误,您需要使用以下语句:SELECT LOWER('Ì') FROM SYSIBM.SYSDUMMYU;
前面语句的结果是值UX'006903070300'。SELECT LOWER(VARCHAR('Ì', 3)) FROM SYSIBM.SYSDUMMYU; - 示例 3:
- 根据内置函数 LOWER 和区域设置名称 'LT_LT' 为表 EMPLOYEE 创建索引 EMPLOYEE_NAME_LOWER。
CREATE INDEX EMPLOYEE_NAME_LOWER ON EMPLOYEE (LOWER(LASTNAME, 'LT_LT', 60), LOWER(FIRSTNAME, 'LT_LT', 60), ID); - 示例 4:
- 使用默认的本地值“”和LOWER函数为表 T1 创建一个索引LNAME。然后在查询中指定相同的表达式。
CREATE INDEX LNAME ON TI (LOWER(LASTNAME, ' ')); SELECT LOWER(LASTNAME, ' ') FROM TI WHERE LOWER(LASTNAME, ' ') = 'smith'; - 示例 5:
- 为表 T1 创建一个基于LOWER函数的LNAME索引,区域设置名称为“FR_CA”。 然后在查询中指定相同的表达式,但省略区域设置名称字符串。
CREATE INDEX LNAME ON TI (LOWER(LASTNAME, 'FR_CA'));如果查询是一个动态语句,且当前区域设置 LC_CTYPE 特殊寄存器包含“FR_CA”:SELECT LASTNAME FROM TI WHERE LOWER(LASTNAME)='smith';在准备阶段,当前区域设置 LC_CTYPE 中的区域设置 'FR_CA' 用于谓词中的 LOWER(LASTNAME),以确定索引 LNAME 是否可以用于索引访问。 如果在访问路径选择中使用索引 LNAME,则运行时 CURRENT LOCALE LC_CTYPE 中的区域设置必须保持不变。
如果查询是一个静态语句,并且在安装面板 DSNTIPF 的区域 LC_CTYPE 字段中设置了区域设置 'FR_CA':SELECT LASTNAME FROM TI WHERE LOWER(LASTNAME)='smith';绑定时,安装面板 DSNTIPF 的区域设置 LC_CTYPE 文件中的本地“FR_CA”用于判断索引 LNAME 是否用于索引访问的谓词中的 LOWER(LASTNAME)。 如果在访问路径选择中选择了索引 LNAME,则 CURRENT LOCALE LC_CTYPE 特殊寄存器中的区域设置必须包含“FR_CA”。
