|
| 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