2011-02-09 54 views
5

¿Hay alguna forma de realizar una operación LIKE con XQuery de la misma manera que con SQL?xQuery LIKE-operator?

Quiero construir algunas expresiones "startswith", "endswith" y "contains".

ejemplo de lo que quiero lograr:

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 

¿Hay alguna manera de lograr esto en XQuery?

EDIT:

tiene la respuesta a la pregunta anterior. Nuevo problema:

¿Habría alguna manera de hacer esto al revés? Me gustaría ejecutar esas consultas con el operador sql equivalente NOT LIKE. es posible? Tiene que ser en un FLWOR expresión

Edit2:

solucionado el problema. Puede ejecutar fn: not (starts-with ('123', '1')) y devuelve falso.

+0

Estoy desconcertado por la restricción "tiene que estar en una expresión FLWOR". ¿Qué pasa con la formulación más simple '/ user [matches (firstname, '. * Xxx')]'? Las expresiones de ruta simples a menudo son más concisas que las expresiones FLWOR. –

+0

Esta es una pregunta útil, que parecía haber respondido usted mismo, pero no proporcionó el resultado. ¿Puedes publicar tus respuestas aquí por favor? ¿Pudo utilizar la sintaxis de la cadena del comparador LIKE o tuvo que traducirla a una cadena de comparación específica de xQuery? – Ben

Respuesta

13

XPath 2.0 y XQuery 1.0 (como normalizado por el W3C) tiene soporte expresión regular con la función matcheshttp://www.w3.org/TR/xpath-functions/#func-matches:

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

Y, por supuesto hay funciones como starts-with y contains (tanto en XPath 1.0/2.0) y ends-with (solo en XPath 2.0) que podrían ser suficientes.

+0

Eso resuelve el problema. –

+0

@Martin Honnen: +1 Buena respuesta. Editado porque la última oración puede ser confusa. –

+3

XPath 1.0 equivalente de la función '' ends-with' XPath 2.0: 'substring ($ string, string-length ($ string) - string-length ($ pattern) + 1) = $ pattern' –

Cuestiones relacionadas