CAST 规范

CAST 规范返回强制类型转换操作数 (第一个操作数) ,强制类型转换为 数据类型指定的类型。 如果不支持强制类型转换,那么将返回错误 (SQLSTATE 42846)。

cast-specification
Read syntax diagramSkip visual syntax diagram CAST1 ( expressionNULLparameter-markerASdata-typeSCOPE2typed-table-nametyped-view-namecursor-cast-specificationrow-cast-specificationinterval-cast-specification )
cursor-cast-specification
Read syntax diagramSkip visual syntax diagramparameter-markerAS CURSORcursor-type-name
row-cast-specification
Read syntax diagramSkip visual syntax diagram row-expressionNULLparameter-marker AS row-type-name
interval-cast-specification
Read syntax diagramSkip visual syntax diagram string-constant AS INTERVAL
data-type
Read syntax diagramSkip visual syntax diagrambuilt-in-typearray-type-namedistinct-type-namestructured-type-nameREF( type-name2)
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA3CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)NCHARNATIONALCHARCHARACTER(1)( integer)NVARCHARNCHAR VARYINGNATIONALCHARCHARACTERVARYING( integer)NCLOBNCHAR LARGE OBJECTNATIONAL CHARACTER LARGE OBJECT(1M)( integerKMG)BINARY(1)( integer)VARBINARYBINARY VARYING( integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)( integer)BOOLEANXMLSYSPROC.DB2SECURITYLABEL
Notes:
  • 1 For compatibility purposes, you can use :: as the type cast operator. For example, the statements C1::INTEGER and cast(C1 as INTEGER) are equivalent.
  • 2 The SCOPE clause only applies to the REF data type.
  • 3 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
expression
如果强制类型转换操作数是表达式 (参数标记或 NULL 除外) ,那么结果是转换为指定目标 数据类型的自变量值。

将字符串 (CLOBs 除外) 强制转换为具有不同长度的字符串时,如果发生截断非尾部空格的情况,将返回警告 (SQLSTATE 01004)。 将图形字符串 (非 DBCLOBs) 强制转换为具有不同长度的图形字符串时,如果发生除尾部空格以外的截断,那么将返回警告 (SQLSTATE 01004)。 对于 BLOB , CLOB 和 DBCLOB 强制类型转换操作数,如果截断了任何字符,那么将发出警告。

强制类型转换数组时,目标数据类型必须是用户定义的数组数据类型 (SQLSTATE 42821)。 数组元素的数据类型必须与目标数组数据类型的元素的数据类型相同 (SQLSTATE 42846)。 数组的基数必须小于或等于目标数组数据类型的最大基数 (SQLSTATE 2202F)。

NULL
如果强制类型转换操作数是关键字 NULL ,那么结果是具有指定 数据类型的空值。
参数-标记
参数标记通常被视为表达式,但在这种情况下会单独记录,因为它具有特殊含义。 如果强制类型转换操作数是 参数标记,那么指定的 数据类型 将被视为可将替换项分配给指定的数据类型 (使用字符串的存储分配) 的承诺。 此类参数标记被视为 类型参数标记。 为了函数解析,选择列表的 DESCRIBE 或列赋值的目的,类型化参数标记将被视为任何其他类型化值。
光标投射规范
用于指示参数标记应该是游标类型的强制类型转换规范。 可以在允许游标类型的上下文中支持表达式的任何位置使用此参数。
参数-标记
强制类型转换操作数是参数标记,被视为可将替换项分配给指定游标类型的承诺。
游标
指定内置数据类型 CURSOR。
cursor-type-name
指定用户定义的游标类型的名称。
行强制类型转换规范
强制类型转换规范,其中输入是行值,结果是用户定义的行类型。 仅当允许 row-expression 时, row-cast-specification 才有效。
row-expression
row-expression 的数据类型必须是立足于表或视图定义的行类型变量。 row-expression 的数据类型不得是用户定义的行类型 (SQLSTATE 42846)。
指定强制类型转换操作数为空值。 结果是具有指定数据类型的每个字段的空值的行。
参数-标记
强制类型转换操作数是参数标记,被视为可将替换项分配给指定的 row-type-name的承诺。
row-type-name
指定用户定义的行类型的名称。 row-expression 必须可强制转换为 row-type-name (SQLSTATE 42846)。
间隔转换规范
一种强制类型转换规范,其中输入是区间的字符串表示,结果是十进制持续时间。 以下语句等价:
CAST (string-constant as INTERVAL)
INTERVAL string-constant
有关可能的字符串常量值的更多信息,请参阅 INTERVAL 标量函数
data-type
现有数据类型的名称。 如果未限定类型名称,那么将使用 SQL 路径来执行数据类型解析。 指定 数据类型时,具有关联属性 (例如,长度或精度和小数位) 的数据类型应包含这些属性。
  • CHAR 的缺省长度为 1
  • BINARY 缺省为长度 1
  • DECIMAL 缺省为精度 5 和小数位 0
  • 如果未指定,那么 DECFLOAT 缺省为精度 34
FOR SBCS DATA 子句或 FOR MIXED DATA 子句 (根据数据库是否支持图形数据类型,仅支持一个) 可用于将 FOR BIT DATA 字符串强制转换为数据库代码页。 对受支持数据类型的限制基于指定的强制类型转换操作数。
  • 对于作为 表达式的强制类型转换操作数,受支持的目标数据类型取决于强制类型转换操作数的数据类型 (源数据类型)。 如果未对 VARCHAR , VARGRAPHIC , NVARCHAR 或 VARBINARY 数据类型指定长度属性,那么在指定长度参数时,将使用相应的内置强制类型转换函数的规则,根据第一个参数的数据类型来确定长度属性。
  • 对于作为关键字 NULL 的强制类型转换操作数,可以使用任何现有数据类型。 如果未对 VARCHAR , VARGRAPHIC , NVARCHAR 或 VARBINARY 数据类型指定 length 属性,那么将使用长度属性 1。
  • 对于作为参数标记的强制类型转换操作数,目标数据类型可以是任何现有数据类型。 如果数据类型是用户定义的单值类型,那么使用参数标记的应用程序将使用用户定义的单值类型的源数据类型。 如果数据类型是用户定义的结构化类型,那么使用参数标记的应用程序将对用户定义的结构化类型使用 TO SQL 变换函数的输入参数类型。 如果未对 VARCHAR , VARGRAPHIC , NVARCHAR 或 VARBINARY 数据类型指定长度属性,那么将使用长度属性 254。
如果数据类型是使用数据类型约束定义的单值类型,那么将应用数据类型约束,并且这些约束必须求值为 true 或未知,否则将返回错误 (SQLSTATE 23528)。
built-in-type
请参阅 "CREATE TABLE" 以获取内置数据类型的描述。
范围
当数据类型是引用类型时,可以定义用于标识引用的目标表或目标视图的作用域。
typed-table-name
类型化表的名称。 该表必须已存在 (SQLSTATE 42704)。 强制类型转换必须为 数据类型 REF (S) ,其中 S类型表名称 的类型 (SQLSTATE 428DM)。
typed-view-name
类型视图的名称。 该视图必须存在或具有与正在创建的视图相同的名称,该视图包含作为视图定义一部分的强制类型转换 (SQLSTATE 42704)。 强制类型转换必须为 数据类型 REF (S) ,其中 S类型视图名称 的类型 (SQLSTATE 428DM)。

将数字数据强制转换为字符数据时,结果数据类型为固定长度的字符串。 将字符数据强制转换为数字数据时,结果数据类型取决于指定的数字类型。 例如,如果强制类型转换为整数,那么它将变为大整数。

示例

  • 应用程序仅对 EMPLOYEE 表中的 SALARY (定义为十进制 (9, 2)) 的整数部分感兴趣。 可以准备以下查询,包括员工编号和 SALARY 的整数值。
       SELECT EMPNO, CAST(SALARY AS INTEGER) FROM EMPLOYEE
  • 假定存在在 SMALLINT 上定义的名为 T_AGE 的单值类型,并用于在人事表中创建列 AGE。 还假定存在一个名为 R_YEAR 的单值类型,该类型是在 INTEGER 上定义的,用于在人事表中创建列 RETIRE_YEAR。 可以准备以下更新语句。
       UPDATE PERSONNEL SET RETIRE_YEAR =?
         WHERE AGE = CAST( ? AS T_AGE)

    第一个参数是数据类型为 R_YEAR 的非类型参数标记,尽管应用程序将对此参数标记使用整数。 这不需要显式 CAST 规范,因为它是赋值。

    第二个参数标记是强制转换为单值类型 T_AGE 的带类型参数标记。 这满足了必须使用兼容数据类型执行比较的要求。 应用程序将使用源数据类型 (即 SMALLINT) 来处理此参数标记。

    此语句的成功处理假定 SQL 路径包含定义了两种不同类型的模式的模式名称。

  • 应用程序提供的值是一系列位,例如音频流,并且在 SQL 语句中使用之前不应进行代码页转换。 应用程序可以使用以下 CAST:
       CAST( ? AS VARCHAR(10000) FOR BIT DATA)
  • 假定已创建数组类型和表,如下所示:
       CREATE TYPE PHONELIST AS DECIMAL(10, 0) ARRAY[5]
    
       CREATE TABLE EMP_PHONES
         (ID          INTEGER,
          PHONENUMBER DECIMAL(10,0) ) 
    以下过程返回一个数组,其中包含 具有标识的员工 1775 的电话号码。 如果此员工有 5 个以上的 电话号码 ,那么将返回错误 (SQLSTATE 2202F)。
       CREATE PROCEDURE GET_PHONES(OUT EPHONES PHONELIST)
       BEGIN
         SELECT CAST(ARRAY_AGG(PHONENUMBER) AS PHONELIST)
         INTO EPHONES
         FROM EMP_PHONES
         WHERE ID = 1775;
       END