CAST 规范

CAST 规范返回第一个操作数(转换操作数),该操作数被转换为 data-type 指定的数据类型。

CAST规范的语法

阅读语法图跳过可视化语法图 CAST ( 表达式NULL参数标记 AS 数据类型 )

数据类型:

阅读语法图跳过可视化语法图built-in-type独特类型名称数组类型

内置类型:

阅读语法图跳过可视化语法图SMALLINTINTEGERINTBIGINTDECIMALDECNUMERIC(5,0)( 整数整数)DECFLOAT(34)(16)FLOAT(53)( 整数)REALDOUBLEPRECISIONCHARACTERCHAR(1个八位字节)( 长度)CHARACTERCHARVARYINGVARCHAR( 长度)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDBITDATACCSID整数CHARACTERCHARLARGE OBJECTCLOB( 1M 单位:字节)( 长柄)CCSIDASCIIEBCDICUNICODEFORSBCSMIXEDDATACCSID整数GRAPHIC(1 CODEUNITS16 )( 长度)VARGRAPHIC(长度)DBCLOB(1M CODEUNITS16)( 长柄)CCSIDASCIIEBCDICUNICODE整数BINARY(1)( 整数)BINARY VARYINGVARBINARY( 整数)BINARY LARGE OBJECTBLOB(1M)( 整数KMG)DATETIMETIMESTAMP(6)(整数)WITHOUT TIME ZONEWITH TIME ZONEROWIDXML

长度:

阅读语法图跳过可视化语法图 整数 1CODEUNITS16CODEUNITS32OCTETS
注意:
  • 1 FL 502 当第一个参数是数字数据时,不能使用 GRAPHIC 和 VARGRAPHIC 指定 OCTETS 和 CODEUNITS32。

长:

阅读语法图跳过可视化语法图 整数 KMG CODEUNITS16CODEUNITS32OCTETS

CAST规格说明

如果两个操作数的数据类型不同,则权限集必须隐式包含对不同类型转换函数的 EXECUTE 权限。 如果第二个操作数表示字符数据,则CAST规范允许将第二个操作数转换为特定编码方案或CCSID。 CCSID子句可以指定为CHAR、VARCHAR、CLOB、GRAPHIC、VARGRAPHIC和DBCLOB数据类型。

表达式
指定赋值操作数是除 NULL 以外的表达式或参数标记。 结果是将操作数值转换为指定的目标数据类型

支持的转换在数据类型之间的转换中显示。 如果不支持演员表,则返回错误。

当任何数据类型转换为图形数据类型的字符时,如果任何非空字符被截断,则会发出警告。 如果在转换BLOB操作数时截断了任何字符,或者在将带有时区的TIMESTAMP操作数转换为字符串时截断了时区字符,也会出现该警告。

NULL
指定转换操作数为空。 结果为指定目标数据类型的空值。
参数标记
通常被视为表达式的参数标记作为赋值操作数具有特殊含义。 操作数是参数标记时,指定的数据类型表示参数标记的替换值将可分配给指定的数据类型(使用存储分配规则)。 这种参数标记被视为类型化参数标记。 为了函数解析、选择列表描述或列分配的目的,键入的参数标记将像其他键入值一样处理。
数据类型
指定结果的数据类型。 如果数据类型不明确,则使用SQL路径来查找适当的数据类型。 更多信息,请参阅 SQL路径
SMALLINT
对于一个小整数。
INTEGER 或 INT
对于整数。
BIGINT
对于一个大整数。
DECIMAL (integer,integer ) 或 DEC (integer,integer )
DECIMAL(integer ) 或 DEC(integer )
小数点或DEC
对于十进制数。 第一个整数是数字的精度。 即1-31之间的数字总数。 第二个整数是数字的刻度。 即小数点右边的位数,范围从0到数字的精确度。

您可以将 DECIMAL(p) 用于 DECIMAL(p,0 ),将 DECIMAL 用于 DECIMAL(5,0)。

您也可以使用 NUMERIC 代替 DECIMAL。 例如,NUMERIC(8)与DECIMAL(8)等效。 与DECIMAL不同,NUMERIC不允许缩写。

DECFLOAT (整数
对于十进制浮点数。 整数的值必须为16或34,表示可存储的有效数字位数。 如果省略整数 ,则 DECFLOAT 值可以表示 34 位有效数字。
FLOAT(integer)
FLOAT
浮点数。 如果整数在1到21(含)之间,则格式为单精度浮点。 如果整数在22到53之间(包括22和53),则格式为双精度浮点。

您可以使用DOUBLE PRECISION或FLOAT来表示FLOAT(53)。

为了在操作系统之间实现可移植性,在指定浮点数据类型时,请使用REAL或DOUBLE,而不要使用FLOAT。

REAL
用于单精度浮点。
DOUBLE或DOUBLE PRECISION
用于双精度浮点运算
CHARACTER( 整数 ) 或 CHAR( 整数 )
性格或品格

对于长度为整数的固定长度字符串,其范围是1-255。 如果省略长度说明,则默认长度为1个字符。

您可以指定以特定的字符串单位数来评估结果的长度: CODEUNITS16、 CODEUNITS32 或OCTETS。 如果表达式是一个定义为位数据的字符串,则不能指定 CODEUNITS16 或 CODEUNITS32。 更多信息,请参阅字符串单元规格

VARCHAR( 整数 ) CHAR VARYING( 整数 ) 或 CHARACTER VARYING( 整数 )

对于长度可变且最大值为整数且在1-32764之间的字符串。

您可以指定以特定的字符串单位数来评估结果的长度: CODEUNITS16、 CODEUNITS32 或OCTETS。 如果表达式是一个定义为位数据的字符串,则不能指定 CODEUNITS16 或 CODEUNITS32。 更多信息,请参阅字符串单元规格

CLOB( 整数 [K|M|G])、CHAR LARGE OBJECT( 整数 [K|M|G])或 CHARACTER LARGE OBJECT( 整数 [K|M|G])
CLOB,CHAR LARGE OBJECT,或CHARACTER LARGE OBJECT

指定最大字节数目的字符串(CLOB)。 最大长度必须在1-2147483647之间。

当未指定整数时,默认长度为 1 M。 可以为整数指定的最大值取决于是否也指定了单位指示符,如下表所示。
整数
整数的最大值为2147483647。 字符串的最大长度为整数
整数 K
整数的最大值为2097152。 最大长度为1024倍整数
整数 M
整数的最大值为2048。 最大长度为1,048,576倍整数
数 G
整数的最大值为2。 最大长度为1,073,741,824次整数

整数可以与K、M或G用0个或更多空格隔开。

如果您指定的值为2千兆字节(2,147,483,648), Db2 将使用少一个字节的值,即2147483647。

您可以指定以特定的字符串单位数来评估结果的长度: CODEUNITS16、 CODEUNITS32 或OCTETS。 更多信息,请参阅字符串单元规格

图形 (长度
GRAPHIC

对于长度为整数的固定长度图形字符串,其范围是1-127。 如果省略长度说明,则默认长度为1个字符。

您可以指定以特定字符串单位数来评估结果的长度: CODEUNITS16 或 CODEUNITS32。 更多信息,请参阅字符串单元规格

VARGRAPHIC (整数

对于最大长度为 1-32764 范围内的整数的变长图形字符串。

您可以指定以特定字符串单位数来评估结果的长度: CODEUNITS16 或 CODEUNITS32。 更多信息,请参阅字符串单元规格

DBCLOB (整数 [K|M|G])
DBCLOB

对于双字节字符大对象(DBCLOB)字符串,其最大长度为双字节字符。 最大长度必须在1-1,073,741,823之间。

当未指定整数时,默认长度为 1M整数 K|M|G的含义与CLOB类似。 不同之处在于,指定的数字是双字节字符的数量。

整数可以与K、M或G用0个或更多空格隔开。

您可以指定以特定的字符串单位数来评估结果的长度: CODEUNITS16、 CODEUNITS32 或OCTETS。 更多信息,请参阅字符串单元规格

BINARY(integer)
长度为整数的固定长度二进制字符串。 整数范围是1-255。 如果省略长度规范,那么假设为1个字节的长度。
BINARY VARYING( 整数 ) 或 VARBINARY( 整数 )
长度可变的二进制字符串,最大长度为整数 ,范围为1-32764。
BLOB( 整数 [K|M|G]或BINARY LARGE OBJECT( 整数 [K|M|G])
BLOB或二进制大对象
对于指定最大字节数长的二进制大对象(BLOB)字符串。 最大长度必须在1-2147483647之间。

当未指定整数时,默认长度为 1M整数 K|M|G的含义与CLOB相同。

整数可以与K、M或G用0个或更多空格隔开。

日期
约会。
时间
有一段时间。
TIMESTAMP 整数WITHOUT TIME ZONE
用于时间戳。 integer 指定可选的时间戳精度属性,且必须在0-12的范围内。 时间戳精度表示时间戳中包含的小数位数。 缺省值为 6。
TIMESTAMP 整数WITH TIME ZONE
带有时区的时间戳。 integer 指定可选的时间戳精度属性,且必须在0-12的范围内。 时间戳精度表示时间戳中包含的小数位数。 缺省值为 6。
  • 如果转换操作数为表达式 ,请参阅数据类型之间的转换 ,并使用转换操作数的数据类型所支持的任何目标数据类型。
  • 如果操作数是空值,则可以使用任何数据类型。
  • 如果操作数是参数标记
    • 如果目标数据类型是不同的类型,则使用参数标记的应用程序使用不同类型的基本数据类型。
    • 如果目标数据类型是数组类型:
      • 源数组值中的元素必须可转换为目标数组类型元素的类型。 源数组值的索引值必须可转换为目标数组类型索引的数据类型。
      • 如果目标数组类型为普通数组,则源数组值的基数必须小于或等于目标数组类型的最大基数。
    • 否则,任何数据类型都有效。
CCSID 编码方案
指定目标数据类型的编码方案。 SBCS、BIT和MIXED数据的特定CCSID由指定编码方案的服务器的默认CCSID决定。 有效值为ASCII、EBCDIC和UNICODE。
FOR 子类型 DATA
指定字符串值的子类型,其数据类型为CHAR、VARCHAR或CLOB。 不要将 FOR 子类型 DATA 子句与任何其他数据类型(包括任何不同类型)的值一起使用。 子类型是以下关键词之一:
SBCS
该值包含单字节数据。
MIXED
该值包含混合数据。 如果MIXED DECP的值为NO,则不要指定MIXED。
BIT
列保存位数据。 请勿将BIT指定为CLOB值。 当子类型为“位”时,只有字符串有效。
CCSID整数
指定使用 CCSID整数对目标数据类型进行编码。 该值必须是DECP中的CCSID值之一。 如果第二个操作数是CHAR、VARCHAR或CLOB,则指定的CCSID必须是SBCS、MIXED CCSID或65535(用于位数据)。 如果第二个操作数是 GRAPHIC、VARGRAPHIC 或 DBCLOB,则指定的 CCSID 必须为 DBCS CCSID。 参见 《确定结果的CCSID (如果未指定CCSID 整数或CCSID 编码方案 )》。 请参阅 “确定结果的CCSID ”,了解有关CCSID 367的特殊注意事项。

CAST规格说明

长度和CCSID子句之间的交互作用
如果同时指定了长度和CCSID子句,则首先将数据转换为指定的CCSID,然后应用长度。 如果指定了 CODEUNITS16 或 CODEUNITS32 ,则长度规格适用于指定的单位。 也就是说,数据被转换为中间形式(Unicode),应用长度,然后转换为指定的CCSID。
铸造功能的解析
Db2 使用隐式或显式的模式名称和数据类型名称以及函数解析来确定将表达式转换为数据类型时使用的特定函数。 更多信息请参阅 “功能解析 ”。
CAST的结果

当数字数据转换为字符数据时,结果的数据类型是固定长度的字符串,与CHAR函数的结果类似。 (更多信息,请参阅 CHAR标量函数。) 当字符数据转换为数字数据时,结果的数据类型取决于指定数字的数据类型。 例如,转换为整数的字符数据会变成一个大整数,这与INTEGER函数的结果类似。 (更多信息请参阅 INTEGER或INT标量函数。)

如果结果的数据类型为字符,且未指定 FOR 子类型 DATA 子句,则结果子类型由以下规则确定:

  • 如果表达是图形化的,则结果子类型是混合的。
  • 如果表达式是日期时间数据类型,则结果的子类型是混合的。 例外情况是当默认编码方案为EBCDIC时,且系统上没有EBCDIC的混合数据或图形数据。
  • 如果表达式是行ID, 数据类型不是CLOB,则结果为位数据。
  • 如果表达是特征,那么结果的子类型与表达相同。
  • 否则,子类型取决于结果的编码方案。 如果结果的编码方案不是Unicode,且MIXED DECP值为NO,则结果的子类型为SBCS。 否则,结果将混合。
将常量值转换为DECFLOAT
若要设置常数值(负零值)或浮点常数 DECFLOAT,请将数值指定为字符串常数,而非数字常数。 例如:
DECFLOAT('-0')               -- causes DB2 to retain the negative sign for a
                             --   value of negative zero
DECFLOAT('1.00E20')          -- causes DB2 to preserve the precision of the 
                             --   floating point constant
确定CCSID和结果的编码方案

结果的CCSID取决于是否指定了CCSID子句以及CAST规范的指定环境。

如果指定了CCSID子句,则CCSID子句用于确定结果的CCSID,如下所示:

  • 如果CCSID条款指定为EBCDIC、ASCII或UNICODE,则该条款将决定结果的编码方案。 结果的CCSID是结果数据类型编码方案的适当CCSID(来自DECP)。
  • 如果CCSID子句指定了代表位数据的数值(65535),则结果的CCSID取决于源数据类型。 如果源数据不是字符串数据,则结果的 CCSID 就是应用程序编码方案的适当 CCSID。 参见字符串的编码方案和 CCSID 规则中的注释 1。 如果源是字符串数据,则结果的编码方案与表达式的编码方案相同,但结果被视为位数据。
  • 如果CCSID子句指定了数值,则该数值即为结果的CCSID。 结果的编码方案由数字CCSID决定。 在CAST规范中,CCSID 367指的是ASCII数据。 例如,假设MYDATA是字符串数据,需要转换为CHAR(10)。 以下CAST规范返回ASCII SBCS数据:
    CAST(MYDATA AS CHAR(10) CCSID 367)
    要将数据明确转换为Unicode SBCS,请使用以下语法:
    CAST(MYDATA AS CHAR(10) CCSID UNICODE 
          FOR SBCS DATA) 

如果未指定CCSID子句,则结果为位数据时,其CCSID为65535。 否则,如果结果的数据类型是字符或图形字符串数据类型,则结果的编码方案和CCSID按如下方式确定:

  • 如果表达式数据类型都是字符,则结果的编码方案与表达式相同。 例如,假设CHAR_COL是以下示例中的字符列:
    CAST(CHAR_COL AS VARCHAR(25))
    CAST的结果是一个与输入具有相同编码方案的变长字符串。 结果的CCSID是编码方案和结果子类型的适当CCSID。
  • 如果表达式数据类型都是图形,则结果的编码方案和CCSID与表达式相同。
  • 如果结果为字符串, 表达式为日期时间,则结果CCSID为表达式编码方案的适当CCSID,结果子类型为CCSID的适当子类型。
  • 如果结果是字符,则结果的编码方案和CCSID取决于CAST规范的指定环境:
    • 如果语句遵循《 字符串的编码方案和 CCSID 规则 》中描述的类型 1 语句的规则,则 CCSID 的确定方法如下:
      • 如果语句引用了表或视图,则该表或视图的编码方案将决定结果的编码方案。
      • 否则,编码方案为EBCDIC,使用默认的EBCDIC CCSID,子类型取决于MIXED DECP值。
      结果的CCSID是编码方案和结果子类型的适当CCSID。
    • 否则,结果的CCSID是应用程序编码方案和结果子类型所对应的CCSID。
  • 如果结果是图形,则结果的编码方案和CCSID取决于CAST规范的指定环境:
    • 如果语句遵循《 字符串的编码方案和 CCSID 规则 》中描述的类型 1 语句的规则,则 CCSID 的确定方法如下:
      • 如果语句引用了表或视图,则该表或视图的编码方案将决定结果的编码方案。
      • 否则,结果将使用默认的EBCDIC编码方案。
      结果的CCSID是编码方案和结果数据类型的适当CCSID。
    • 否则,结果的CCSID是结果的应用编码方案的适当CCSID。
  • 否则,结果的CCSID取决于CAST规范指定的上下文。
    • 如果语句遵循《 字符串的编码方案和 CCSID 规则 》中对语句类型 1 所描述的规则,则 CCSID 的确定方法如下:
      • 如果语句引用了表或视图,则该表或视图的编码方案将决定结果的编码方案。
      • 否则,结果将使用默认的EBCDIC编码方案。
      结果的CCSID是编码方案和结果数据类型的适当CCSID。
转换不同类型的替代语法
将不同类型转换为基本数据类型,反之亦然,有多种语法可供选择。 假设定义了单独的 D_MONEY 类型,并使用以下语句定义了 MONEY 列,且该列使用该数据类型。
CREATE TYPE D_MONEY AS DECIMAL(9,2);
DECIMAL(MONEY)与CAST(MONEY AS DECIMAL(9,2))语法相同。 这两种语法形式都使用了创建不同类型D_MONEY时 Db2 生成的转换函数,用于将不同类型转换为源类型DECIMAL(9,2)。
然而,由于函数解析的差异,特别是对非限定名称的处理,对于相同的语法形式,可能会选择不同的赋值函数。 虽然功能解析的过程对于两者来说都是相似的,但在上述CAST规范中, Db2 使用目标数据类型的模式名称来定位函数。 因此,如果将不合法的数据类型名称指定为目标数据类型, Db2 将使用SQL路径解析不同类型的架构名称,然后在架构中搜索函数。 在函数表示法中,当指定一个非限定函数名称时, Db2 会在SQL路径中搜索模式,以找到合适的匹配函数,如函数解析中所述。 例如,假设您定义了以下不同类型,这隐式地授予您对不同类型的 USAGE 权限以及对为其生成的转换函数的 EXECUTE 权限:
CREATE TYPE SCHEMA1.AGE AS DECIMAL(2,0);
   one of the generated cast functions is:
   FUNCTION SCHEMA1.AGE(SYSIBM.DECIMAL(2,0)) RETURNS SCHEMA1.AGE
CREATE TYPE SCHEMA2.AGE AS INTEGER;
   one of the generated cast functions is:
   FUNCTION SCHEMA2.AGE(SYSIBM.INTEGER) RETURNS SCHEMA2.AGE
如果将整数主机变量 STU_AGE 转换为不同的类型,且 SQL 路径为 SYSIBM,则 SCHEMA1 , SCHEMA2:
Syntax 1:  CAST(:STU_AGE AS AGE);
Syntax 2:  AGE(:STU_AGE);
选择不同的铸造功能。 对于语法1, Db2 首先将不同类型AGE的架构名称解析为 SCHEMA1 (路径中的第一个架构,其中包含一个名为AGE的不同类型,您对相应生成的转换函数具有EXECUTE权限)。 然后,它在该架构中寻找合适的函数,并选择 SCHEMA1.AGE ,因为 STU_AGE 的数据类型为INTEGER,可升级为函数参数的数据类型,即DECIMAL(2,0)。 对于语法2, Db2 在路径中搜索所有模式以找到合适的函数,并选择 SCHEMA2.AGE。 Db2 选择 而不是 ,是因为其参数的数据类型(INTEGER) SCHEMA2.AGE SCHEMA1.AGE 与STU_AGE (INTEGER)完全匹配,因此比 的参数(DECIMAL(2,0))更匹配。 SCHEMA1.AGE
时区的语法替代方案
可以指定 TIMEZONE 作为 TIME ZONE 的替代。

CAST规范的示例

示例 1
假设应用程序只需要工资表中的整数部分,即雇员表中定义为 DECIMAL(9,2) 的部分。 可以准备以下查询,查询员工编号和工资的整数部分。
  SELECT EMPNO, CAST(SALARY AS INTEGER) FROM EMPLOYEE;
示例 2

假设在模式SCHEMAX中存在两种不同的类型。 独特的 D_AGE 类型基于 SMALLINT,是 PERSONNEL 表中 AGE 列的数据类型。 不同的 D_YEAR 类型基于 INTEGER,是同一表格中 RETIRE_YEAR 列的数据类型。 可以准备以下UPDATE语句。

  UPDATE PERSONNEL SET RETIRE_YEAR =?
                   WHERE AGE = CAST( ? AS SCHEMAX.D_AGE); 

第一个参数是一个未分类的参数标记,数据类型为RETIRE_YEAR。 但是,应用程序将使用整数作为参数标记。 参数标记不需要进行赋值,因为SET是一个赋值。

第二个参数标记是一个类型参数标记,转换为不同的类型 D_AGE。 参数标记的设置满足了必须使用兼容数据类型进行比较的要求。 应用程序将使用基本数据类型 SMALLINT 来处理参数标记。

示例 3
CAST 规范可用于在必须键入参数标记的情况下明确指定参数的数据类型。 在下面的示例中,CAST 规范用于告诉 Db2 假设作为 TIME 函数的输入提供的值将是 CHAR(20)。 参见 PREPARE语句 ,了解在调用函数时,参数标记可以不加类型的情况。 对于调用函数的所有其他情况,CAST规范可用于明确指定参数标记的类型。
  INSERT INTO ADMF001.CASTSQLJ VALUES( TIME(CAST(? AS CHAR(20)) ) )
示例 4

假设一个应用程序要将EBCDIC字符串转换为Unicode UTF-8。 字符串包含值“Jürgen”,在ASCII或EBCDIC中为6个字节,在Unicode中为7个字节 UTF-8。 在以下查询中,CAST规范与长度子句一起调用,并指定了 CODEUNITS32 ,以确保数据不被截断。 (在这种情况下,也可以将 CODEUNITS16 指定为字符串单元。)

   SELECT CAST('Jürgen' AS VARCHAR(6 CODEUNITS32) CCSID UNICODE) 
     FROM SYSIBM.SYSDUMMY1;

对于此查询,数据从EBCDIC转换为Unicode UTF-16 ,应用长度子句,然后将 UTF-16 结果转换为 UTF-8。

示例 5

当关键字用于特殊值时,该特殊值在上下文中以常量形式表示,而关键字可能被解释为名称,此时可以使用 CAST 规范将特殊值显式转换为十进制浮点数。 假设MYTAB包含名为 C1 和INFINITY的列,并且您想在同一SQL语句中引用无穷大的十进制浮点值。 使用CAST规范将INFINITY明确转换为十进制浮点值,以确保它不会被解释为列名、参数名或变量名:

   SELECT INFINITY                              -- column named INFINITY
    FROM MYTAB
       WHERE C1 = CAST ('INFINITY' AS DECFLOAT) -- comparison is made with the 
                                                -- decimal floating-point 
                                                --  infinity value