Skip to content

Commit 72a977f

Browse files
committed
Add README
1 parent 9f34905 commit 72a977f

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed

doc/sql.extensions/README.listagg

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
SQL Language Extension: LISTAGG
2+
3+
Function:
4+
The current implementation has an aggregate function LIST which concatenates multiple row
5+
fields into a blob. The SQL standard has a similar function called LISTAGG. The major
6+
difference is that it also supports the ordered concatenation.
7+
8+
Authors:
9+
Chudaykin Alex <[email protected]>
10+
11+
Format:
12+
<listagg set function> ::=
13+
LISTAGG <left paren> [ <set quantifier> ] <character value expression> <comma> <listagg separator> [ <listagg overflow clause> ] <right paren> <within group specification>
14+
15+
<listagg separator> ::=
16+
<character string literal>
17+
18+
<listagg overflow clause> ::=
19+
ON OVERFLOW <overflow behavior>
20+
21+
<overflow behavior> ::=
22+
ERROR | TRUNCATE [ <listagg truncation filler> ] <listagg count indication>
23+
24+
<listagg truncation filler> ::=
25+
<character string literal>
26+
27+
<listagg count indication> ::=
28+
WITH COUNT | WITHOUT COUNT
29+
30+
<within group specification> ::=
31+
WITHIN GROUP <left paren> ORDER BY <sort specification list> <right paren>
32+
33+
Syntax Rules:
34+
The legacy LIST syntax is preserved for backward compatibility, LISTAGG is added to cover the
35+
standard features.
36+
37+
There is a <listagg overflow clause> rule in the standard, which is intended to output an error
38+
when the output value overflows. Since the LIST function always returns a BLOB, it was decided
39+
that this rule would be meaningless. It was not implemented and silently ignored if specified.
40+
41+
If DISTINCT is specified for LISTAGG, then ORDER BY <sort specification list> must fully match
42+
<character value expression>
43+
44+
Notes:
45+
If DISTINCT is specified, the presence of WITHIN GROUP must obey the restriction and will not
46+
affect the subsequent code execution.
47+
48+
Examples:
49+
CREATE TABLE TEST_T
50+
(COL1 INT, COL2 VARCHAR(2), COL3 VARCHAR(2), COL4 VARCHAR(2), COL5 BOOLEAN, COL6 VARCHAR(2)
51+
CHARACTER SET WIN1251);
52+
COMMIT;
53+
INSERT INTO TEST_T values(1, 'A', 'A', 'J', false, 'П');
54+
INSERT INTO TEST_T values(2, 'B', 'B', 'I', false, 'Д');
55+
INSERT INTO TEST_T values(3, 'C', 'A', 'L', true, 'Ж');
56+
INSERT INTO TEST_T values(4, 'D', 'B', 'K', true, 'Й');
57+
COMMIT;
58+
59+
SELECT LISTAGG (ALL COL4, ':') AS FROM TEST_T;
60+
=======
61+
J:I:L:K
62+
63+
SELECT LISTAGG (DISTINCT COL4, ':') FROM TEST_T;
64+
========
65+
I:J:K:L
66+
67+
SELECT LISTAGG (DISTINCT COL3, ':') FROM TEST_T;
68+
====
69+
A:B
70+
71+
SELECT LISTAGG (DISTINCT COL3, ':') WITHIN GROUP (ORDER BY COL2) FROM TEST_T;
72+
====
73+
A:B
74+
75+
SELECT LISTAGG (DISTINCT COL3, ':') WITHIN GROUP (ORDER BY COL2 DESCENDING) FROM TEST_T;
76+
====
77+
A:B
78+
79+
SELECT LISTAGG (COL2, ':') WITHIN GROUP (ORDER BY COL2 DESCENDING) FROM TEST_T;
80+
=======
81+
D:C:B:A
82+
83+
SELECT LISTAGG (COL4, ':') WITHIN GROUP (ORDER BY COL3 DESC) FROM TEST_T;
84+
=======
85+
I:K:J:L
86+
87+
SELECT LISTAGG (COL3, ':') WITHIN GROUP (ORDER BY COL5 ASCENDING) FROM TEST_T;
88+
=======
89+
A:B:A:B
90+
91+
SELECT LISTAGG (COL4, ':') WITHIN GROUP (ORDER BY COL3 ASC) FROM TEST_T;
92+
=======
93+
J:L:I:K
94+
95+
SELECT LISTAGG (ALL COL2) WITHIN GROUP (ORDER BY COL4) FROM TEST_T;
96+
=======
97+
B,A,D,C
98+
99+
SELECT LISTAGG (COL2, ':') WITHIN GROUP (ORDER BY COL3 DESC, COL4 ASC) FROM TEST_T;
100+
=======
101+
B:D:A:C
102+
103+
SELECT LISTAGG (COL2, ':') WITHIN GROUP (ORDER BY COL3 DESC, COL4 DESC) FROM TEST_T;
104+
=======
105+
D:B:C:A
106+
107+
SELECT LISTAGG (COL2, ':') WITHIN GROUP (ORDER BY COL3 ASC, COL4 DESC) FROM TEST_T;
108+
=======
109+
C:A:D:B
110+
111+
SELECT LISTAGG (ALL COL6, ':')FROM TEST_T;
112+
=======
113+
П:Д:Ж:Й
114+
115+
SELECT LISTAGG (ALL COL6, ':') WITHIN GROUP (ORDER BY COL2 DESC) FROM TEST_T;
116+
=======
117+
Й:Ж:Д:П
118+
119+
SELECT LISTAGG (ALL COL2, ':') WITHIN GROUP (ORDER BY COL6) FROM TEST_T;
120+
=======
121+
B:C:D:A
122+
123+
INSERT INTO TEST_T values(5, 'E', NULL, NULL, NULL, NULL);
124+
INSERT INTO TEST_T values(6, 'F', 'C', 'N', true, 'К');
125+
126+
SELECT LISTAGG (ALL COL2, ':') WITHIN GROUP (ORDER BY COL3) FROM TEST_T;
127+
===========
128+
E:A:C:B:D:F
129+
130+
SELECT LISTAGG (ALL COL2, ':') WITHIN GROUP (ORDER BY COL3 NULLS LAST) FROM TEST_T;
131+
===========
132+
A:C:B:D:F:E
133+
134+
SELECT LISTAGG (ALL COL2, ':') WITHIN GROUP (ORDER BY COL6 NULLS FIRST) FROM TEST_T;
135+
===========
136+
E:B:C:D:F:A
137+
138+
SELECT LISTAGG (DISTINCT COL3, ':') WITHIN GROUP (ORDER BY COL2) FROM TEST_T;
139+
========
140+
Statement failed, SQLSTATE = 42000
141+
SQL error code = -104
142+
-Invalid command
143+
-Sort-key of the ORDER BY specification must match the argument list
144+

0 commit comments

Comments
 (0)