算术表达式
算术表达式执行涉及加法、减法、乘法、除法和模数的运算。
下表按从高到低的运算符优先级顺序描述并列示算术运算符。 除非使用圆括号强制对二目运算符进行求值,否则一元运算符的优先顺序高于二目运算符。
| 运算符 | 用途 | 关联性 |
|---|---|---|
| -(unary), +(unary) | 对操作数的值求反,保留操作数的值 | 从右至左 |
| *, div, idiv, mod | 乘法,除法,除法求整,求模 | 从左至右 |
| +, - | 加法,减法 | 从左至右 |
注意 :如果减号运算符可能被解释为前一个标记的一部分,则必须在减号运算符前留出空格。 例如,
a-b
解释为名称,但 a - b 和 a -b 解释为算术运算。 |
||
限制 :算术运算符的运算数不能包含FLWOR表达式。
算术表达式的结果为以下各项之一:
- 数字值
- 日期或时间值
- 持续时间值
- 空序列
- 一个错误
XQuery 使用以下过程来评估算术表达式。
- 将每个操作数分解为一系列原子值。
- 使用以下规则来评估算术表达式中的操作数:
- 如果雾化操作数是空序列,则算术表达式的结果也是空序列。
- 如果原子化操作数是包含多个值的序列,那么会返回错误。
- 如果雾化操作数是一个未类型的原子值( xs:untypedAtomic ),则 XQuery 将值转换为xs:double。 如果铸造失败, XQuery 会返回错误。
- 如果操作数的类型是算术运算符的有效组合, XQuery 会将运算符应用于原子值。 运算的结果是原子值或动态错误(例如,除数为零可能会导致错误)。
- 如果操作数的类型与算术运算符不匹配, XQuery 将引发类型错误。
下表列出了算术运算符的有效类型组合。 在下表中,字母 A 表示表达式中的第一个操作数,字母 B 表示第二个操作数。 数字一词表示xs:integer、xs:decimal、xs:double或从这些类型之一派生的任何类型。 如果运算符的结果类型被列为数字类型,则结果类型将是有序列表中的第一种类型(xs:integer、xs:decimal、xs:double),所有操作数都可以通过子类型替换和类型提升转换为该类型。
| 带操作数的运算符 | 操作数 A 的类型 | 操作数 B 的类型 | 结果类型 |
|---|---|---|---|
| A + B | 数值 | 数值 | 数值 |
| xs:date | xs:yearMonthDuration | xs:date | |
| xs:yearMonthDuration | xs:date | xs:date | |
| xs:date | xs:dayTimeDuration | xs:date | |
| xs:dayTimeDuration | xs:date | xs:date | |
| xs:time | xs:dayTimeDuration | xs:time | |
| xs:dayTimeDuration | xs:time | xs:time | |
| xs:dateTime | xs:yearMonthDuration | xs:dateTime | |
| xs:yearMonthDuration | xs:dateTime | xs:dateTime | |
| xs:dateTime | xs:dayTimeDuration | xs:dateTime | |
| xs:dayTimeDuration | xs:dateTime | xs:dateTime | |
| xs:yearMonthDuration | xs:yearMonthDuration | xs:yearMonthDuration | |
| xs:dayTimeDuration | xs:dayTimeDuration | xs:dayTimeDuration | |
| A - B | 数值 | 数值 | 数值 |
| xs:date | xs:date | xs:dayTimeDuration | |
| xs:date | xs:yearMonthDuration | xs:date | |
| xs:date | xs:dayTimeDuration | xs:date | |
| xs:time | xs:time | xs:dayTimeDuration | |
| xs:time | xs:dayTimeDuration | xs:time | |
| xs:dateTime | xs:dateTime | xs:dayTimeDuration | |
| xs:dateTime | xs:yearMonthDuration | xs:dateTime | |
| xs:dateTime | xs:dayTimeDuration | xs:dateTime | |
| xs:yearMonthDuration | xs:yearMonthDuration | xs:yearMonthDuration | |
| xs:dayTimeDuration | xs:dayTimeDuration | xs:dayTimeDuration | |
| A * B | 数值 | 数值 | 数值 |
| xs:yearMonthDuration | 数值 | xs:yearMonthDuration | |
| 数值 | xs:yearMonthDuration | xs:yearMonthDuration | |
| xs:dayTimeDuration | 数值 | xs:dayTimeDuration | |
| 数值 | xs:dayTimeDuration | xs:dayTimeDuration | |
| A idiv B | 数值 | 数值 | xs:integer |
| A div B | 数值 | 数值 | numeric,但两个操作数都为 xs:integer 时则为 xs:decimal |
| xs:yearMonthDuration | 数值 | xs:yearMonthDuration | |
| xs:dayTimeDuration | 数值 | xs:dayTimeDuration | |
| xs:yearMonthDuration | xs:yearMonthDuration | xs:decimal | |
| xs:dayTimeDuration | xs:dayTimeDuration | xs:decimal | |
| A mod B | 数值 | 数值 | 数值 |
语法
示例
以下查询使用算术表达式计算购买者对某件产品所缴纳的税款金额,税率是 8.25 %,并选择税额大于一个货币单位的描述元素。
SELECT XMLQUERY ('declare namespace pos="http://posample.org";
/pos:product/description[price * .0825 > 1]'
PASSING DESCRIPTION)
FROM T1以下查询减去两个xs:date值,结果为 xs:yearMonthDuration 值 P8559D:
SELECT XMLQUERY(' xs:date("2005-10-10")
- xs:date("1982-05-05")')
FROM SYSIBM.SYSDUMMY1