for clauses
A for clause iterates through the result of an expression and binds a variable to each item in the sequence.
$i
and
an expression that constructs the sequence (1, 2, 3)
:SELECT XMLQUERY(
'for $i in (1, 2, 3)
return <output>{$i}</output>')
FROM SYSIBM.SYSDUMMY1
When the for clause is evaluated,
three variable bindings are created (one binding for each item in
the sequence):$i = 1
$i = 2
$i = 3
The return clause in the example
executes once for each binding. The SQL statement returns a column
with the following row:<output>1</output><output>2</output><output>3</output>
$a
and $b
,
and expressions that construct the sequences 1 2
and 4
5
:SELECT XMLQUERY(
'for $a in (1, 2), $b in (4, 5)
return <output>{$a, $b}</output>'
COLUMNS "x" XML PATH '.')
FROM SYSIBM.SYSDUMMY1
When the for clause
is evaluated, a tuple of variable bindings is created for each combination
of values. This results in four tuples of variable bindings:($a = 1, $b = 4)
($a = 2, $b = 4)
($a = 1, $b = 5)
($a = 2, $b = 5)
The return clause
in the example executes once for each tuple of bindings. The SQL statement
returns a column with the following rows:<output>1 4</output>
<output>2 4</output>
<output>1 5</output>
<output>2 5</output>
When the binding expression evaluates to an empty sequence, no for binding is generated, and no iteration is performed. In the following example, the binding sequence evaluates to an empty sequence and no iteration is performed. The node sequence in the return clause is not returned.
SELECT XMLQUERY(
'for $node in
(<a test="b" />,
<a test="c" />,
<a test="d" />)[@test = "1"]
return
<test>
Sample return response
</test>')
FROM SYSIBM.SYSDUMMY1
Positional variables in for clauses
Each variable that is bound in a for clause can have an associated positional variable that is bound at the same time. The name of the positional variable is preceded by the keyword at. When a variable iterates over the items in a sequence, the positional variable iterates over the integers that represent the positions of those items in the sequence, starting with 1. You can reference the positional variables in the same way that you reference any other variables.
$cat
and an expression
that constructs the sequence ("Persian", "Calico", "Siamese")
.
The clause also includes the positional variable $i
,
which is referenced in an attribute constructor to compute the value
of the order
attribute:SELECT XMLQUERY(
'for $cat at $i in
("Persian", "Calico","Siamese")
return <cat order="{$i}">{$cat}</cat>')
FROM SYSIBM.SYSDUMMY1
($i = 1, $cat = "Persian")
($i = 2, $cat = "Calico")
($i = 3, $cat = "Siamese")
<cat order="1">Persian</cat><cat order="2">Calico</cat><cat order="3">Siamese</cat>
Although
each output element contains an order attribute, the actual order
of the elements in the output stream is not guaranteed unless the
FLWOR expression contains an order by clause
such as order by $i
. The positional variable represents
the ordinal position of a value in the input sequence, not in the
output sequence.