这个查询在Db2 v11.5.7.0中似乎是有效的:
SELECT listagg(DISTINCT x, ',') WITHIN GROUP (ORDER BY x)
FROM (VALUES (1), (1), (2)) t (x)
但是用
SQL Error [42822]: ORDER BY子句中以下位置或以""开头的表达式在"顺序"中条款无效。原因码= "2"…SQLCODE=-214, SQLSTATE=42822, DRIVER=4.29.24
除了x
本身,我还可以在ORDER BY
子句中使用什么其他可能的东西?注意,问题与DISTINCT
有关。如此:
SELECT listagg(x, ',') WITHIN GROUP (ORDER BY x)
FROM (VALUES (1), (1), (2)) t (x)
并产生预期输出:
1, 1、2
这是记录在案的行为。根据文档:
如果为LISTAGG指定了DISTINCT, ORDER BY规范的sort-key必须匹配字符串表达式(SQLSTATE 42822)。如果字符串表达式是隐式强制转换,则排序键必须显式地包含相应的匹配强制转换规范。
所以一个可能的解决方法是:
SELECT listagg(DISTINCT x, ',') WITHIN GROUP (ORDER BY CAST(x as VARCHAR))
FROM (VALUES (1), (1), (2)) t (x)
当然,该排序可能与预期的排序不同,因此此解决方法可能不适用于所有输入数据!