| id |
+----+
| 1 |
| 2 |
| 4 |
| 5 |
+----+
输出为行
1 2 4 5
无需使用Pivot方法,不需要进行硬编码,例如使用1 = 1时的情况进行检查。否动态Sql。功能。
我已经搜索了问题,但在纯sql中找不到任何内容 有办法吗?
答案 0 :(得分:1)
大多数SQL数据库都支持某种组连接功能。例如,在MySQL中,我们可以使用GROUP_CONCAT
:
SELECT GROUP_CONCAT(id ORDER BY id SEPARATOR ' ') AS output
FROM yourTable;
ANSI标准可能未定义任何内容,但是SQL Server,Oracle和Postgres等仅可以做一些类似于上述的事情。
答案 1 :(得分:1)
由于某些DBMS
没有row_number()
,我将使用 corre 子查询并进行有条件的夸张:
SELECT MAX(CASE WHEN Seq = 1 THEN Id END) AS ID1,
. . .
MAX(CASE WHEN Seq = 4 THEN Id END) AS ID4
FROM (SELECT t.*,
(SELECT COUNT(*) FROM table t1 WHERE t1.id <= t.id) AS Seq
FROM table t
) t;
但是,如果ID
不是按顺序方式,则此方法可能会失败,那么您将需要使用指定列顺序的PK
(IDENTITY
列)。
答案 2 :(得分:1)
也许您的数据库支持ANSI SQL:2016的 LISTAGG 功能: 该功能可以将一组行中的值转换为定界字符串。
查看语法以及数据库支持和替代方法here:
Listagg 是有序集合函数,它需要
within group
子句来指定顺序。最小语法为:LISTAGG(<expression>, <separator>) WITHIN GROUP(ORDER BY …)
答案 3 :(得分:0)
如果知道有四个值,则可以使用条件聚合:
select max(case when seqnum = 1 then id end) as id_1,
max(case when seqnum = 2 then id end) as id_2,
max(case when seqnum = 3 then id end) as id_3,
max(case when seqnum = 4 then id end) as id_4
from (select t.*, row_number() over (order by id) as seqnum
from t
) t;
我不确定这是否符合您的要求。如果要查找具有可变列数的内容,则需要使用动态SQL。