使用SELECT FROM DUAL能否返回多行?特定查询能否得到单列多行结果?
没问题,我来给你梳理清楚这两个问题~
能不能用
SELECT FROM DUAL返回多行数据? 当然可以!虽然DUAL本身是个单行虚拟表,但通过一些语法技巧,完全可以让它输出多行结果,不同数据库的实现方式略有不同:
Oracle:
- 最直观的方式是用
UNION ALL拼接多个单行查询:SELECT 1 FROM DUAL UNION ALL SELECT 2 FROM DUAL UNION ALL SELECT 4542 FROM DUAL UNION ALL SELECT 342 FROM DUAL; - 更简洁的写法是借助集合函数,用
TABLE配合内置的数值列表类型:SELECT column_value FROM TABLE(SYS.ODCINUMBERLIST(1, 2, 4542, 342));
- 最直观的方式是用
MySQL:
MySQL里DUAL其实是可选的,但同样可以用UNION ALL,或者用VALUES子句直接生成多行数据集:SELECT * FROM (VALUES (1), (2), (4542), (342)) AS t(col);PostgreSQL:
可以用unnest拆解数组,或者用VALUES子句构建多行:SELECT unnest(ARRAY[1, 2, 4542, 342]);
执行
SELECT (1, 2, 4542, 342) FROM DUAL;能得到单列多行结果吗? 答案是不行,这个写法的逻辑和你想要的完全不一样:
- 在Oracle中,
(1,2,4542,342)会被解析成一个记录类型,查询结果是一行,显示类似(1,2,4542,342)的复合值,不会拆分成多行。 - 在MySQL中,括号里的逗号会被当作逗号运算符,最终只会返回最后一个值
342,结果是单行单列。 - 在PostgreSQL中,
(1,2,4542,342)是行构造器,会返回一行包含四个列的结果,而非单列多行。
如果想要得到你期望的单列多行输出,就得用我上面提到的UNION ALL、集合函数或者VALUES子句这类方法。
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

