表达式

表达式指定值。 它可以是简单值,仅由常量或列名组成,也可以更复杂。 如果重复使用类似的复杂表达式,请考虑使用 SQL 函数来封装公共表达式。

授权

使用某些表达式 (例如标量子查询,序列引用或函数调用) 可能需要特殊授权。 对于这些表达式,语句的授权标识所拥有的特权必须包含以下权限:
标量-子查询
有关授权注意事项的信息,请参阅 SQL 查询
sequence-reference
引用序列的权限。 有关授权注意事项的信息,请参阅 序列授权
函数调用
执行用户定义的函数的权限。 有关授权注意事项的信息,请参阅 函数中的 函数调用 部分。
变量
如果变量是全局变量,那么需要授权来引用全局变量。 有关信息,请参阅 全局变量

在 Unicode 数据库中,接受字符或图形字符串的表达式将接受支持转换的任何字符串类型。

expression
Read syntax diagramSkip visual syntax diagramoperator ~  +  - function-invocation1(expression)constant2column-namevariable3special-register4scalar-fullselect5labeled-duration6case-expression7cast-specification8field-reference9xmlcast-specification10array-element-specification11array-constructor12dereference-operation13method-invocation14OLAP-specification15row-change-expression16sequence-reference17subtype-treatment18search-condition19
operator
Read syntax diagramSkip visual syntax diagram **  *  /  %  CONCAT  || 20 +  -  &  |  ^
Notes:

没有运算符的表达式

如果未使用任何运算符,那么表达式的结果是指定的值。 例如:

   SALARY:SALARY'SALARY'MAX(SALARY)

包含并置运算符的表达式

并置运算符 (CONCAT 或 | |) 组合了两个操作数以形成 字符串表达式

第一个操作数是一个表达式,它返回任何字符串数据类型,任何数字数据类型或任何日期时间数据类型的值。 第二个操作数也是一个表达式,它返回任何字符串数据类型,任何数字数据类型或任何日期时间数据类型的值。 但是,不支持将某些数据类型与第一个操作数的数据类型结合使用,如本节的其余部分中所述。

每个操作数可以是下列任何类型:
  • 字符串 (二进制字符串除外)
  • 数字 (这隐式强制转换为 VARCHAR)
  • 日期时间 (隐式强制类型转换为 VARCHAR)
  • 布尔值 (此值隐式强制转换为 VARCHAR)
但是,只能将二进制字符串与另一个二进制字符串或定义为 FOR BIT DATA 的字符串并置。

涉及字符串操作数和图形字符串操作数的并置仅在 Unicode 数据库中受支持。 在并置之前,首先将字符操作数转换为图形数据类型。 不能将定义为 FOR BIT DATA 的字符串强制转换为图形数据类型。

如果任一操作数可以为空,那么结果可以为空,如果任一操作数为空,那么结果为空值。 否则,结果由第一个操作数字符串后跟第二个操作数字符串组成。 请注意,在执行并置时,不会对格式不正确的混合数据进行检查。

结果的长度是操作数长度的总和。 在 Unicode 数据库中,结果的字符串单元是操作数的最大字符串单元,如 结果数据类型的规则中所述。

除非使用 CODEUNITS32: 定义了操作数,否则将根据下表中所示的操作数确定结果的数据类型和长度属性:

表 1. 不带 CODEUNITS32 的并置操作数的数据类型和长度
操作数 组合的长度属性1 结果
CHAR(A) CHAR(B) <256 CHAR(A+B)
CHAR(A) CHAR(B) >255 VARCHAR(A+B)
CHAR(A) VARCHAR(B) <4001 VARCHAR(A+B)
CHAR(A) VARCHAR(B) >4000 LONG VARCHAR
CHAR (A) LONG VARCHAR - LONG VARCHAR
VARCHAR(A) VARCHAR(B) <4001 VARCHAR(A+B)
VARCHAR(A) VARCHAR(B) >4000 LONG VARCHAR
VARCHAR (A) LONG VARCHAR - LONG VARCHAR
LONG VARCHAR LONG VARCHAR - LONG VARCHAR
CLOB(A) CHAR(B) - CLOB (MIN (A + B , 2147483647))
CLOB(A) VARCHAR(B) - CLOB (MIN (A + B , 2147483647))
CLOB (A) LONG VARCHAR - CLOB (MIN (A+32700, 2147483647))
CLOB(A) CLOB(B) - CLOB (MIN (A + B , 2147483647))
GRAPHIC(A) GRAPHIC(B) <128 GRAPHIC(A+B)
GRAPHIC(A) GRAPHIC(B) >127 VARGRAPHIC(A+B)
GRAPHIC(A) VARGRAPHIC(B) <2001 VARGRAPHIC(A+B)
GRAPHIC(A) VARGRAPHIC(B) >2000 LONG VARGRAPHIC
GRAPHIC (A) LONG VARGRAPHIC - LONG VARGRAPHIC
VARGRAPHIC(A) VARGRAPHIC(B) <2001 VARGRAPHIC(A+B)
VARGRAPHIC(A) VARGRAPHIC(B) >2000 LONG VARGRAPHIC
VARGRAPHIC (A) LONG VARGRAPHIC - LONG VARGRAPHIC
长变量图 - LONG VARGRAPHIC
DBCLOB (A) 图形 (B) - DBCLOB (MIN (A + B , 1073741823))
DBCLOB (A) VARGRAPHIC (B) - DBCLOB (MIN (A + B , 1073741823))
DBCLOB (A) 长变量图 - DBCLOB (MIN (A+16350, 1073741823))
DBCLOB (A) DBCLOB (B) - DBCLOB (MIN (A + B , 1073741823))
BINARY (A) BINARY (B) <256 BINARY (A + B)
二进制 (A) CHAR (B) for BIT 数据 <256 BINARY (A + B)
BINARY (A) BINARY (B) >255 VARBINARY (A + B)
二进制 (A) CHAR (B) for BIT 数据 >255 VARBINARY (A + B)
BINARY (A) VARBINARY (B) - VARBINARY (MIN (A + B , 32672))
BINARY (A) VARCHAR (B) for BIT 数据 - VARBINARY (MIN (A + B , 32672))
VARBINARY (A) VARBINARY (B) - VARBINARY (MIN (A + B , 32672))
用于 BIT 数据的 VARBINARY (A) CHAR (B) - VARBINARY (MIN (A + B , 32672))
VARBINARY (A) VARCHAR (B) for BIT 数据 - VARBINARY (MIN (A + B , 32672))
BLOB (A) BINARY (B) - BLOB (MIN (A + B , 2147483647))
BLOB (A) CHAR (B) FOR BIT 数据 - BLOB (MIN (A + B , 2147483647))
BLOB (A) VARBINARY (B) - BLOB (MIN (A + B , 2147483647))
BLOB (A) VARCHAR (B) for BIT 数据 - BLOB (MIN (A + B , 2147483647))
BLOB(A) BLOB(B) - BLOB (MIN (A + B , 2147483647))

1 在 OCTETS 中列出了为 "组合长度" 属性指定的数字 (对于字符串) 和 CODEUNITS16 (对于图形字符串)。 如果使用 CODEUNITS32定义了操作数,请参阅下表。

如果使用 CODEUNITS32定义操作数,那么不能将其他操作数定义为 FOR BIT DATA。 否则,使用 CODEUNITS32定义操作数时,将根据操作数的数据类型和长度属性确定结果的数据类型和长度属性,如下表所示:

表 2. 与 CODEUNITS32 并置的操作数的数据类型和长度
操作数 组合的长度属性 结果
CHAR(A) CHAR(B) <64 CHAR(A+B)
CHAR(A) CHAR(B) 63 VARCHAR(A+B)
CHAR(A) VARCHAR(B) - VARCHAR (MIN (A + B , 8168))
VARCHAR(A) VARCHAR(B) - VARCHAR (MIN (A + B , 8168))
CLOB(A) CHAR(B) - CLOB (MIN (A + B , 536870911))
CLOB (A) VARCHAR (B) - CLOB (MIN (A + B , 536870911))
CLOB(A) CLOB(B) - CLOB (MIN (A + B , 536870911))
GRAPHIC(A) GRAPHIC(B) <64 GRAPHIC(A+B)
GRAPHIC(A) GRAPHIC(B) 63 VARGRAPHIC(A+B)
GRAPHIC(A) VARGRAPHIC(B) - VARGRAPHIC (MIN (A + B , 8168))
VARGRAPHIC(A) VARGRAPHIC(B) - VARGRAPHIC (MIN (A + B , 8168))
DBCLOB(A) CHAR(B) - DBCLOB (MIN (A + B , 536870911))
DBCLOB(A) VARCHAR(B) - DBCLOB (MIN (A + B , 536870911))
DBCLOB (A) DBCLOB (B) - DBCLOB (MIN (A + B , 536870911))

为了与先前版本或其他数据库产品兼容,不会将涉及 LONG VARCHAR 或 LONG VARGRAPHIC 数据类型的结果自动升级到 LOB 数据类型。 例如, CHAR (200) 值与完全完整的 LONG VARCHAR 值的并置将导致错误,而不是提升到 CLOB 数据类型。

结果的代码页被视为派生代码页,并由其操作数的代码页确定。 有关更多信息,请参阅 字符串转换规则

一个操作数可以是参数标记。 如果使用参数标记,那么该操作数的数据类型和长度属性将被视为与非参数标记操作数的数据类型和长度属性相同。 在具有嵌套并置的情况下,必须考虑操作顺序以确定这些属性。

示例 1: 如果 FIRSTNME 是 Pierre , LASTNAME 是 Fermat ,那么如下所示:
   FIRSTNME CONCAT ' ' CONCAT LASTNAME
返回值 Pierre Fermat
示例 2: 给定:
  • COLA 定义为 VARCHAR (5) ,并且已将值 'AA' 插入其中。
  • 字符主变量 :host_var 是使用长度 5 和值 'BB   '定义的。
  • 已将定义为 CHAR (5) 的列 COLC 和值 'CC' 插入其中。
  • 已将定义为 CHAR (5) 的列 COLD 和值 'DDDDD' 插入其中。
COLA CONCAT :host_var CONCAT COLC CONCAT COLD 的值为 'AABB   CC   DDDDD'

结果的数据类型为 VARCHAR ,其长度属性为 2 + 5 + 5 + 5 = 17。 结果代码页是 section 代码页。 有关部分代码页的更多信息,请参阅 代码页值的派生

示例 3: 给定:
  • COLA 定义为 CHAR (10)
  • COLB 定义为 VARCHAR (5)
表达式中的参数标记:
   COLA CONCAT COLB CONCAT ?
被视为 VARCHAR (15) ,因为首先对 COLA CONCAT COLB 求值,给出的结果是第二个 CONCAT 操作的第一个操作数。

用户定义的类型和并置运算符

弱类型单值类型是唯一可与并置运算符配合使用的用户定义类型。 处理并置运算符时,弱类型单值类型的源类型将用作操作数的数据类型。

强类型用户定义的类型不能与并置运算符一起使用,即使它是具有字符串类型的源数据类型的强类型单值类型。 要并置,请创建以 CONCAT 运算符作为其源的函数。 例如,如果有单值类型 TITLE 和 TITLE_DESCRIPTION ,这两种类型都具有 VARCHAR (25) 数据类型,那么可以使用以下用户定义的函数 ATTACH 来并置它们。
   CREATE FUNCTION ATTACH (TITLE, TITLE_DESCRIPTION)
     RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())
或者,可以使用用户定义的函数来添加新数据类型,从而重载并置运算符。
   CREATE FUNCTION CONCAT (TITLE, TITLE_DESCRIPTION)
     RETURNS VARCHAR(50) SOURCE CONCAT (VARCHAR(), VARCHAR())

具有算术运算符的表达式

如果表达式使用算术运算符,那么表达式的结果是从运算符对操作数值的应用派生的值。 可以使用 infix 或前缀表示法来指定这些运算符。 例如,语句 a+b"+"(a,b) 等效。

如果算术表达式中的任何操作数可以为空,或者如果在将 dft_sqlmathwarn 设置为 yes的情况下配置数据库,那么结果可以为空。 如果算术表达式中的任何操作数具有空值,那么表达式的结果为空值。

算术运算符可以应用于带符号的数字类型和日期时间类型 (请参阅 SQL 中的日期时间算术)。 例如, USER+2 无效。 当算术运算的任何操作数是弱类型单值类型时,将执行该操作,假定操作数的数据类型是弱类型单值类型的源类型。 可以为具有带符号数字类型的源类型的 强类型 单值类型的算术运算定义有源函数。

一元加号 (+) 前缀运算符不会更改其操作数。 一元减号 (-) 前缀运算符会反转以下符号:
  • 非零非十进制浮点操作数
  • 十进制浮点操作数,包括 0、-0、静NaNs,、信号NaNs,、+无穷大和-无穷大
如果值 x 的数据类型为小整数,那么 -x 的数据类型为大整数。 前缀运算符后面的标记的第一个字符不能是加号 (+) 或减号 (-)。
表 3. 二进制算术运算符
arithmetic operator(算术运算符) 姓名 描述
+ 新增项 结果是第一个和第二个自变量的总和。
- 减法 结果是第一个自变量减去第二个自变量。
* 乘法 结果是第一个自变量乘以第二个自变量。
/ 部门 结果是第一个自变量除以第二个自变量。 除非使用十进制浮点运算来执行计算,否则第二个操作数的值不能为零。
% 取模 结果是第一个自变量的其余部分除以第二个自变量。
** 指数(X) 结果是第一个自变量被提升到第二个自变量的幂。 结果的数据类型为:
  • INTEGER (如果两个自变量都是 INTEGER 或 SMALLINT 类型)
  • BIGINT (如果一个自变量的类型为 BIGINT ,而另一个自变量的类型为 BIGINT , INTEGER 或 SMALLINT)
  • DECFLOAT (34) 如果其中一个或两个自变量都是 DECFLOAT 类型,除非下列其中一个语句为真,在这种情况下,结果为 NAN 类型,并且发出了无效的操作条件:
    • 这两个自变量都为零。
    • 第二个自变量具有非零小数部分。
    • 第二个自变量具有超过 9 个数字。
    • 第二个参数是 INFINITY。
  • 否则为 DOUBLE

在执行算术运算之前,非 LOB 字符串的操作数将使用 CAST 规范的规则转换为 DECFLOAT (34)。 有关更多信息,请参阅 在数据类型之间进行转换。 只能对 Unicode 数据库执行涉及图形字符串操作数的算术运算。

算术错误

如果在处理非十进制浮点表达式期间发生算术错误 (例如,除零或数字溢出) ,那么将返回错误 (SQLSTATE 22003 或 22012)。 对于十进制浮点表达式,将返回警告 (SQLSTATEs 0168C, 0168D, 0168E或 0168F,具体取决于算术条件的性质)。

可以配置数据库 (使用设置为 YES 的 dft_sqlmathwarn ) ,以便算术错误返回非十进制浮点表达式的空值,查询返回警告 (SQLSTATE 01519 或 01564) ,并继续处理 SQL 语句。

对于十进制浮点表达式, dft_sqlmathwarn 的设置没有效果; 算术条件返回适当的值 (可能是十进制浮点特殊值) ,查询返回警告 (SQLSTATEs 0168C, 0168D, 0168E或 0168F) ,并继续处理 SQL 语句。 返回的特殊值包括正负无穷大,而不是数字。 涉及一个或多个十进制浮点数的算术表达式从不求值为空值,除非该表达式的一个或多个自变量为空。

当算术错误被视为空值时,会对 SQL 语句的结果产生影响。 以下是这些影响的一些示例。

  • 在作为聚集函数的自变量的表达式中发生的算术错误会导致在确定聚集函数的结果时忽略该行。 如果算术错误是溢出,那么这可能会严重影响结果值。
  • 在 WHERE 子句中谓词的表达式中发生的算术错误可能导致结果中不包含行。
  • 检查约束中谓词的表达式中发生的算术错误会导致更新或插入过程,因为该约束不为 false。
如果这些类型的影响不可接受,那么应执行其他步骤来处理算术错误以生成可接受的结果。 示例:
  • 添加 case 表达式以检查是否存在除零,并为此类情况设置必需值
  • 添加其他谓词以处理空值 (例如,对不可空列的检查约束可能变为:
       check (c1*c2 is not null and c1*c2>5000)
    导致在溢出时违反约束)。

两个整数操作数

如果算术运算符的两个操作数都是整数,那么将以二进制方式执行操作,结果是 大整数 ,除非其中一个 (或两个) 操作数都是大整数,在这种情况下,结果是大整数。 任何剩余的除法都将丢失。 整数算术运算的结果 (包括通过一元减运算符进行的求反) 必须在结果类型的范围内。

整数和小数操作数

如果一个操作数是整数,另一个操作数是十进制,那么将使用已转换为十进制数的精度为 p 且小数位为 0 的整数的临时副本来执行十进制操作; p 对于大整数为 19 ,对于大整数为 11 ,对于小整数为 5。

两个十进制操作数

如果两个操作数都是十进制,那么将以十进制执行该操作。 任何十进制算术运算的结果都是具有精度和小数位的十进制数,这些精度和小数位取决于运算以及操作数的精度和小数位。 如果操作是加法或减法,并且操作数没有相同的小数位,那么将使用其中一个操作数的临时副本来执行该操作。 较短操作数的副本使用尾部零进行扩展,以便其小数部分具有与较长操作数相同的位数。

十进制操作的结果不能具有大于 31 的精度。 十进制加法,减法和乘法的结果派生自可具有大于 31 的精度的临时结果。 如果临时结果的精度不大于 31 ,那么最终结果与临时结果相同。

SQL 中的十进制算术

使用此处显示的公式来计算 SQL 中十进制运算结果的精度和小数位。 公式使用以下符号:
p
第一个操作数的精度。
s
第一个操作数的小数位。
p'
第二个操作数的精度。
s'
第二个操作数的小数位。
加法和减法
结果的小数位为 MAX(s,s')。 如果 DEC15 方式生效,并且 p<15p'<15有效,那么精度为 MIN(15,MAX(p-s,p'-s')+MAX(s,s')+1)。 否则,精度为 MIN(31,MAX(p-s,p'-s')+MAX(s,s')+1)
乘法
如果 DEC15 方式生效,并且 p<15p'<15,那么精度为 MIN(15,p+p') ,小数位为 MIN(15,s+s')。 否则,精度为 MIN(31,p+p') ,小数位为 MIN(31,s+s')
部门
下表显示了基于各种因素的结果精度和刻度。
表 4. 十进制除法结果的精度和小数位
DECIMAL 算术方式1 p 普阿 结果精度 结果标度
缺省值 不适用 不适用 31 31-p+s-s'
DEC15 ≤15 ≤15 15 15-(p-s+s')
DEC15 >15 ≤15 31 N-(p-s+s'),其中:
  • N30-p' if p' 为奇数
  • N29-p' if p' 是偶数
DEC31 不适用 ≤15 31 N-(p-s+s'),其中:
  • N30-p' if p' 为奇数
  • N29-p' if p' 是偶数
DEC15 或 DEC31 不适用 >15 31 15-(p-s+MAX(0,s'-(p'-15)))
注:
  1. 这些方式由 dec_arithmetic 配置参数确定。

如果最小 DECIMAL 除法小数位 S 生效,那么小数位是 S 的最小值和派生自 表 4的小数位。 否则,负刻度会导致错误 (SQLSTATE 42911)。

指数(X)
结果类型为 DOUBLE。

浮点操作数

如果算术运算符的任一操作数是浮点数,但不是十进制浮点数,那么将在浮点数中执行该操作。 必要时,首先将操作数转换为双精度浮点数。 因此,如果表达式的任何元素是浮点数,那么表达式的结果是双精度浮点数。

涉及浮点数和整数的操作是使用已转换为双精度浮点的整数的临时副本执行的。 使用已转换为双精度浮点数的十进制数的临时副本执行涉及浮点数和十进制数的操作。 浮点运算的结果必须在浮点数范围内。

处理浮点操作数 (或函数的自变量) 的顺序会略微影响结果,因为浮点操作数是实数的近似表示。 由于优化器可能会隐式修改操作数的处理顺序 (例如,优化器可能决定要使用的并行度以及要使用的存取方案) ,因此使用浮点操作数的应用程序不应依赖于每次执行 SQL 语句时的结果是否完全相同。

十进制浮点操作数

如果算术运算符的任一操作数是十进制浮点数,那么将在十进制浮点数中执行该操作。
整数和十进制浮点操作数
如果一个操作数是小整数或大整数,而另一个操作数是 DECFLOAT (n) number,那么将使用已转换为 DECFLOAT (n) number的整数的临时副本在 DECFLOAT (n) 中执行该操作。 如果一个操作数是大整数,另一个操作数是十进制浮点数,那么大整数的临时副本将转换为 DECFLOAT (34) number。 然后,将应用双十进制浮点操作数的规则。
十进制和十进制浮点操作数
如果一个操作数是十进制数,另一个操作数是十进制浮点数,那么将使用十进制数的临时副本 (已根据十进制数的精度转换为十进制浮点数) 在十进制浮点数中执行该操作。 如果十进制数的精度小于 17 ,那么十进制数将转换为 DECFLOAT (16) 号; 否则,十进制数将转换为 DECFLOAT (34) 号。 然后,将应用双十进制浮点操作数的规则。
浮点和十进制浮点操作数
如果一个操作数是浮点 数字 (REAL 或 DOUBLE) ,另一个是 DECFLOAT (n) 数字,那么将使用已转换为 DECFLOAT (n) 数字的浮点数的临时副本以十进制浮点数执行操作。
两个十进制浮点操作数
如果两个操作数都是 DECFLOAT (n),那么将在 DECFLOAT (n)中执行该操作。 如果一个操作数是 DECFLOAT (16) ,另一个操作数是 DECFLOAT (34),那么将在 DECFLOAT (34)中执行该操作。

十进制浮点的常规算术运算规则

以下一般规则适用于十进制浮点数据类型的所有算术运算:
  • 对有限数的每个运算都执行,就像在可能的情况下使用系数上的整数算术计算精确的数学结果一样。

    如果理论精确结果的系数不超过反映其精度的位数 (16 或 34) ,则用于结果而不改变 (除非存在下流或溢出条件)。 如果系数的位数超过了反映其精度的位数,那么它将舍入为正好反映其精度的位数 (16 或 34) ,并且指数将增加除去的位数。

    CURRENT DECFLOAT ROUNDING MODE 专用寄存器确定舍入方式。

    如果结果的调整后指数的值小于 Emin,那么计算的系数和指数构成结果,除非指数的值小于 E微小(在这种情况下,指数设置为 E微小) ,否则系数将舍入 (可能为零) 以匹配指数的调整,并且符号保持不变。 如果此舍入给出不准确的结果,那么将返回下流异常条件。

    如果结果的调整指数值大于 Emax,那么将返回溢出异常条件。 在这种情况下,结果定义为溢出异常条件,并且可能是无限的。 它与理论结果具有相同的标志。

  • 使用特殊值无穷大的算术遵循通常的规则,其中负无穷大小于每个有限数,正无穷大大于每个有限数。 在这些规则下,一个无限的结果总是准确的。 某些使用无穷大会返回无效的操作条件。 以下列表显示了可导致无效操作条件的操作。 当其中一个操作数是无穷大但另一个操作数不是 NaN (安静或信令) 时,此类操作的结果是 NaN 。
    • 在加法或减法操作期间对 -infinity 添加 + 无穷大
    • 将 0 乘以 + 无穷大或 -infinity
    • 将 + 无穷大或 -infinity 除以 + 无穷大或 -infinity
    • QUANTIZE 函数的自变量为 + infinity 或 -infinity
    • POWER 函数的第二个自变量是 + infinity 或 -infinity
    • 信号 NaN 是算术运算的操作数
    以下规则适用于算术运算和 NaN 值:
    • 具有 NaN (静默或信令) 操作数的任何算术运算的结果都是 NaN。 结果的符号从第一个操作数中复制,而第一个操作数是一个有符号NaN;如果两个操作数都没有符号,则符号从第一个操作数中复制,而第一个操作数是一个NaN。 只要结果是NaN,结果的符号就只取决于复制的操作数。
    • 仅当操作数具有不同的符号并且都不是 NaN时,乘法或除法运算结果的符号才为负数。
    • 只有当加法或减法运算的结果小于零,且两个操作数都不是NaN,时,运算结果的符号才是负数,但以下情况除外,在这些情况下,运算结果为-0:
      • 结果将四舍五入为 0 ,并且该值在四舍五入之前具有负号
      • 0 减去-0
      • 添加具有相反符号的操作数,或减去具有相同符号的操作数; 结果的系数为 0 ,舍入方式为 ROUND_FLOOR
      • 操作数乘以或除以,结果的系数为 0 ,并且操作数的符号不同
      • POWER 函数的第一个参数是-0,第二个参数是正奇数
      • CEIL、FLOOR 或 SQRT 函数的参数是-0
      • ROUND 或 TRUNCATE 函数的第一个参数是-0
以下示例将特殊十进制浮点值显示为操作数:
   INFINITY + 1          = INFINITY
   INFINITY + INFINITY   = INFINITY
   INFINITY + -INFINITY  = NAN         -- warning
   NAN + 1               = NAN
   NAN + INFINITY        = NAN
   1 - INFINITY          = -INFINITY
   INFINITY - INFINITY   = NAN         -- warning
   -INFINITY - -INFINITY = NAN         -- warning
   -0.0 - 0.0E1          = -0.0
   -1.0 * 0.0E1          = -0.0
   1.0E1 / 0             = INFINITY    -- warning
   -1.0E5 / 0.0          = -INFINITY   -- warning
   1.0E5 / -0            = -INFINITY   -- warning
   INFINITY / -INFINITY  = NAN         -- warning
   INFINITY / 0          = INFINITY
   -INFINITY / 0         = -INFINITY
   -INFINITY / -0        = INFINITY

用户定义的类型作为算术运算符的操作数

弱类型单值类型操作数可与算术运算符配合使用,前提是弱类型单值类型的源类型受算术运算符支持。 不需要创建其他用户定义的函数来支持弱类型单值类型操作数的算术运算。

强类型的用户定义类型不能与算术运算符配合使用,即使其源数据类型是数字也是如此。 要执行算术运算,请创建以算术运算符作为其源的函数。 例如,如果存在强类型的单值类型 INCOME 和开支 (这两种类型都具有 DECIMAL (8, $TAG1) 数据类型) ,那么可以使用以下用户定义的函数来从另一个函数中减去一个函数。
   CREATE FUNCTION REVENUE (INCOME, EXPENSES)
     RETURNS DECIMAL(8,2) SOURCE "-" (DECIMAL, DECIMAL)
或者,可以使用用户定义的函数来减去新数据类型,从而重载减号 (-) 运算符。
   CREATE FUNCTION "-" (INCOME, EXPENSES)
     RETURNS DECIMAL(8,2) SOURCE "-" (DECIMAL, DECIMAL)

具有按位运算符的表达式

The bitwise operators BITAND (&), BITOR (|), BITXOR (ˆ), and BITNOT (~) correspond to the similarly named scalar functions described in BITAND , BITANDNOT , BITOR , BITXOR 和 BITNOT 标量函数.

如果按位表达式中的任何操作数可以为空,那么结果可以为空。 如果按位表达式中的任何操作数具有空值,那么表达式的结果为空值。

一元按位 BITNOT (~) 前缀运算符将其应用的操作数的每个位反转。 若值的数据类型为 DECIMAL、REAL、 x DOUBLE 或 DECFLOAT(16), ~x 则其数据类型为 DECFLOAT(34);否则,其数据类型与 相同 x

表 5。 二进制按位运算符
按位运算符 姓名 描述
& BITAND 结果是一个位模式,其中每个位都是对输入参数的相应位执行逻辑 AND 运算的结果。
| BITOR 结果是一个位模式,其中每个位都是对输入自变量的相应位执行逻辑 OR 运算的结果。
^ BITXOR 结果是一个位模式,其中每个位都是对输入自变量的相应位执行逻辑 XOR (互斥 OR) 操作的结果。
若位运算表达式(如BITAND(&)、BITOR(|)或BITXOR(ˆ))中任一操作数的数据类型为DECFLOAT,则结果的数据类型为DECFLOAT(34)。 否则,结果的数据类型是其数据类型按数据类型优先顺序排名最高的操作数的数据类型 (请参阅 表 1)。

在执行按位操作之前,非 LOB 字符串的操作数将使用 CAST 规范的规则转换为 DECFLOAT (34)。 有关更多信息,请参阅 在数据类型之间进行转换。 涉及图形字符串操作数的按位运算只能对 Unicode 数据库执行。

操作的优先顺序

首先从左到右对括号和取消引用操作中的表达式进行求值。 (括号也用于全查询,搜索条件和函数。 但是,不应将它们用于对 SQL 语句中的部分进行任意分组。) 如果未使用括号指定求值顺序,那么将按以下顺序对运算符进行求值:
  1. 一元 BITNOT (~)
  2. 一元正 (+) 或一元负 (-) 前缀
  3. 指数 (**)
  4. 乘法 (*) ,除法 (/),模 (%)或并置 (CONCAT 或 | |)
  5. 加 (+) 或减 (-)
  6. 位与(&)、位或(|)或位异或(^)。
  7. 谓词。
  8. 逻辑 NOT。
  9. 逻辑与。
  10. 逻辑或。
将从左到右对处于相同优先顺序级别的运算符进行求值。
图 1。 说明操作优先顺序的示例
sqls0opr

标量全查询 (scalar fullselect)

Scalar fullselect
Read syntax diagramSkip visual syntax diagram(fullselect)

标量全查询 是括在括号中的全查询,它返回由单个列值组成的单行。 如果该全查询未返回行,那么表达式的结果为空值。 如果选择列表元素是仅作为列名或取消引用操作的表达式,那么结果列名将基于列的名称。 标量全查询所需的授权与 SQL 查询所需的授权相同。

兼容性功能

SQL_COMPAT 全局变量设置为 'NPS'时:
  • 符号 ^ 解释为指数运算符 (等同于 **) ,而不是 BITXOR 运算符。 符号 ** 也解释为指数运算符。
  • 符号 # 解释为 BITXOR 运算符。