可转型表达式

可转型表达式测试某个值是否能转换为特定数据类型。 如果该值可转换为该数据类型,那么可转型表达式返回 true。 否则该表达式返回 false。

可转型表达式可用作谓词以避免求值时出现强制类型转换错误。 还可使用它们来选择用于处理值的适当类型。

语法

阅读语法图跳过可视化语法图表达式castable as目标类型 ?
表达式
XQuery 表达式返回单个原子值或空序列。
目标类型
用于测试 Expression 的值是否可进行强制类型转换的类型。 目标类型必须是一个原子类型,并且是预定义的XML模式类型之一。 数据类型 xs:anyAtomicType 和 xs:anySimpleType 不是目标类型的有效类型。
?
表示空序列被视为目标类型的有效实例。 如果 Expression 求值为空序列并且未指定 ?, 未指定时,可转换表达式返回 false

返回的值

如果表达式可以转换为目标类型 ,则转换后的表达式返回 true。 否则,表达式返回 false

如果表达的结果是空序列,且目标类型后跟问号指示符,则可转换表达式返回 true。 在以下示例中,问号指示符跟在目标类型 xs:integer 之后。

$prod/revision castable as xs:integer?
在以下情况下,系统会返回错误:
  • 表达的结果是一系列多个原子值。
  • 目标类型不是为范围内的XML模式类型定义的原子数据类型,也不是不能用于可转换表达式中的数据类型。

示例

下面的示例使用可转换表达式作为谓词,以避免在求值时出错。 如果 @OrderDate 不是有效的日期,这个例子可以避免动态错误。

let $i := if ( $po/@OrderDate castable as xs:date)
              then xs:date($po/@OrderDate) gt xs:date("2009-01-01")
              else 0
return  $po/orderID[$i]

当日期属性为大于2009年1月1日的有效日期时,谓词为真并返回 orderID 。 否则谓词求值为 false 并返回空序列。

下面的示例使用可转换表达式来选择合适的类型来处理给定的值。 该示例将邮政编码视为整数或字符串。

if ($postalcode castable as xs:integer)
   then xs:integer($postalcode)
   else xs:string($postalcode)

以下示例在FLWOR let 子句中使用可转换表达式来测试 $prod/mfgdate 的值,并将一个值绑定到 $currdate。 可变表达式支持使用问号指示符处理空序列。

let $currdate := if ($prod/mfgdate castable as xs:date?)
   then xs:date($prod/mfgdate)
   else xs:date("2000-01-01")

如果 $prod/mfgdate 的值可转换为 xs:date,那么它会转换为该数据类型并绑定至 $currdate。 如果 $prod/mfgdate 是空序列,那么会将空序列绑定至 $currdate。 如果 $prod/mfgdate 不能转换为xs:date,则将xs:date类型的值2000-01-01绑定到 $currdate

在下面的示例中,XMLEXISTS谓词中的可转换表达式在执行比较之前会先测试 /prod/category 的值,以避免在求值时出错。 在 XML 列 FEATURES.INFO 中,文档包含元素 /prod/category。 该值是数字代码或字符串代码。

SELECT F.PRODID FROM F FEATURES
  WHERE XMLEXISTS('$test/prod/category[ (( . castable as xs:double) and . > 100 ) or
  (( . castable as xs:string) and . > "A100" )]'
  PASSING F.INFO as "test")

返回的值是产品ID,其中类别代码大于数字100或大于字符串“ A100 ”。