LOWER 标量函数 (scalar function)

LOWER函数返回一个字符串,其中所有字符都转换为小写字符。

阅读语法图跳过可视化语法图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。
SELECT LOWER('Ì')
  FROM SYSIBM.SYSDUMMYU;
由于某些Unicode字符在处理时会发生扩展,因此会产生错误。 为了避免错误,您需要使用以下语句:
SELECT LOWER(VARCHAR('Ì', 3))
  FROM SYSIBM.SYSDUMMYU;
前面语句的结果是值UX'006903070300'
示例 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”。