分配和比较

SQL 的基本操作包括赋值和比较。

赋值操作在执行语句期间执行,例如CALL、INSERT、UPDATE、MERGE、FETCH、SELECT INTO、SET host-variable 或SET assignment-statement 以及VALUES INTO语句。 此外,当调用函数或存储过程时,函数或存储过程的参数将被分配。 在执行包含谓词和其他语言元素(例如 MAX、MIN、DISTINCT、GROUP BY 和 ORDER BY)的语句期间会执行比较操作。

这两种操作的基本规则是操作数的数据类型必须兼容。 兼容性规则也适用于结果数据类型规则中描述的其他操作。

下表显示了赋值和比较的数据类型兼容性。

表 1. 赋值和比较操作的数据类型兼容性
操作数 BINARY INTEGER 十进制数 浮点 十进制浮点 字符串 图形字符串 二进制字符串 日期 时间 无时区的时间戳 TIMESTAMP WITH TIME ZONE 行标识 用户定义的类型 XML8
BINARY INTEGER 1 1 False False False False False False 2 False
十进制数 1 1 False False False False False False 2 False
浮点 1 1 False False False False False False 2 False
十进制浮点 1 1 False False False False False False 2 False
字符串 1 1 1 1 3, 4 第五名 是的 7 是的 7 是的7 是的 7 False 2 False
图形字符串 6 6 6 6 3, 4 False 37 37 37 37 False 2 False
二进制字符串 False False False False 第五名 False False False False False False 2 False
日期 False False False False 37 False False False False False 2 False
时间 False False False False 37 False False False False False 2 False
无时区的时间戳 False False False False 37 False False False False 2 False
TIMESTAMP WITH TIME ZONE False False False False 37 False False False False 2 False
行标识 False False False False False False False False False False False 2 False
用户定义的类型 2 2 2 2 2 2 2 2 2 2 2 2 是的2 False
XML8 False False False False False False False False False False False False False
  1. 不支持LOBs和位数据。
  2. 用户自定义类型的兼容性规则如下:
    • 用户自定义的类型值仅可与相同用户自定义的类型值进行比较。 一般来说,赋值支持在特定类型值和源数据类型之间进行。
    • 用户自定义数组类型的值只能与相同用户自定义数组类型的值进行比较。
      这意味着,一般来说,普通的数组类型与关联数组类型不兼容。 以下例外仅适用于远程存储过程的CALL语句:
      • 如果两个数组的数组元素的定义兼容,则可以为定义为关联数组的目标指定一个源值,该源值是一个具有整数索引的普通数组。 Db2 将普通数组转换为具有整数索引的关联数组,同时保留原始普通数组中元素的顺序。 然而,如果关联数组定义了VARCHAR索引,则会返回SQL错误代码。
      • 可以将关联数组作为源值指定给定义为普通数组的目标。 Db2 将关联数组转换为普通数组,方法是将关联数组中数组元素的值按与目标普通数组相同的顺序赋值,并赋以适当的索引值。

    更多信息,请参阅用户自定义类型分配

  3. 根据图形和字符的分配和比较,结果字节长度为 3 * (LENGTH(graphic-string)) ,具体取决于CCSID。
  4. 带有子类型 FOR BIT DATA 的字符串与图形数据不兼容。
  5. 所有字符串,包括子类型为“位数据”的字符串,都不与二进制字符串兼容。
  6. 不支持LOBs。
  7. 更改开始日期和时间值与字符串值的兼容性取决于以下因素:
    • 日期时间值可以分配给字符串列和不是LOB值的字符串变量。
    • 一个日期时间值的合法字符串表示可以被赋值给一个日期时间列或变量,或者与一个日期时间值进行比较,如日期时间赋值中所述。

    在某些情况下,可能不支持将字符串值赋给日期时间变量,例如以下示例:

    • 将日期时间值的字符串表示形式赋值给日期时间宿主变量。
    • 在发出 SET CURRENT PACKAGESET 语句后,当日期时间 SQL 变量或 SQL 参数是 SELECT INTO 语句的目标时,SQL PL 中的任务。
    更改结束
  8. 字符串和图形字符串(包括LOB)可以分配给XML列。 相比之下,XML只能使用XMLEXISTS和NULL谓词进行比较。

与具有字段过程的列的兼容性由列的数据类型决定,该数据类型适用于其值的解码形式。

赋值操作的基本规则是,不能将空值赋给:

  • 不能包含空值的列
  • 非Java™主机变量,没有关联的指示变量

    对于确实存在关联指示变量的宿主变量,可通过将指示变量设置为负值来分配空值。 关于指标变量的讨论,请参见宿主变量

  • Java主机变量,属于基本类型

    对于非基本类型的Java宿主变量,该变量的值被设置为Java空值。