xQuery中的LIKE运算符是什么?

7

有没有办法在XQuery中像SQL一样执行LIKE操作?

我想构建一些“以...开始”,“以...结束”和“包含...”的表达式。

我想要实现的示例:

for $x in /user where $x/firstname LIKE '%xxx' return $x
for $x in /user where $x/middlename LIKE 'xxx%' return $x 
for $x in /user where $x/lastname LIKE '%xxx%' return $x

有没有办法在XQuery中实现这个功能?
编辑:
已经得到了上面问题的答案。新问题:
有没有办法以相反的方式做到这一点?我想使用SQL等效的NOT LIKE运算符来运行这些查询。这可能吗?它必须在FLWOR表达式中。
编辑2:
问题已解决。您可以运行fn:not(starts-with('123','1')),它将返回false。

我对“必须在FLWOR表达式中”这个限制感到困惑。使用更简单的形式/user[matches(firstname, '.*xxx')]有什么问题吗?简单路径表达式通常比FLWOR表达式更简洁。 - Michael Kay
这是一个有用的问题,你似乎已经回答了自己的问题,但没有提供输出。请问您能否在此处发布您的答案? 您是否能够使用LIKE比较器字符串的语法,还是需要将其转换为xQuery特定的比较字符串? - Ben
1个回答

13

XPath 2.0和XQuery 1.0(由W3C标准化)支持正则表达式,使用matches函数http://www.w3.org/TR/xpath-functions/#func-matches

/user[matches(firstname, 'xxx$')]

当然还有一些函数可以使用,例如starts-withcontains(在XPath 1.0/2.0中都有),以及ends-with(仅在XPath 2.0中)。这些函数可能已经足够使用了。


@Martin Honnen:+1 好答案。编辑了一下,因为最后一句可能会让人困惑。 - user357812
3
XPath 1.0 中与 XPath 2.0 函数 ends-with 相对应的表达式为:substring($string, string-length($string) - string-length($pattern) + 1) = $pattern。这个表达式的意思是,从 $string 的结尾位置往前数 $pattern 的长度个字符开始截取,得到的子字符串是否等于 $pattern。 - user357812
有没有什么方法可以反过来做这个?我想用SQL等效的NOT LIKE操作符运行这些查询。这可行吗?它必须在FLWOR表达式中。 - jorgen.ringen
1
@JorgenR. 使用not()布尔函数进行反转。 - Flack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接