在SQL语句中选择常量而不引用表是完全合法的:
SELECT 1, 2, 3
后者返回的结果集是包含值的单行。我想知道是否有一种方法可以使用常量表达式一次选择多行,类似于:
SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))
我想要像上面那样工作,并返回一个3行3列的结果集。
在SQL语句中选择常量而不引用表是完全合法的:
SELECT 1, 2, 3
后者返回的结果集是包含值的单行。我想知道是否有一种方法可以使用常量表达式一次选择多行,类似于:
SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))
我想要像上面那样工作,并返回一个3行3列的结果集。
当前回答
SELECT *
FROM DUAL
CONNECT BY ROWNUM <= 9;
其他回答
在PostgreSQL中,你可以做:
SELECT *
FROM (
VALUES
(1, 2),
(3, 4)
) AS q (col1, col2)
在其他系统中,只需使用UNION ALL:
SELECT 1 AS col1, 2 AS col2
-- FROM dual
-- uncomment the line above if in Oracle
UNION ALL
SELECT 3 AS col1, 3 AS col2
-- FROM dual
-- uncomment the line above if in Oracle
在Oracle, SQL Server和PostgreSQL中,您还可以生成任意行数的记录集(可通过外部变量提供):
SELECT level
FROM dual
CONNECT BY
level <= :n
在Oracle中,
WITH q (l) AS
(
SELECT 1
UNION ALL
SELECT l + 1
FROM q
WHERE l < @n
)
SELECT l
FROM q
-- OPTION (MAXRECURSION 0)
-- uncomment line above if @n >= 100
在SQL Server中,
SELECT l
FROM generate_series(1, $n) l
在PostgreSQL。
在Oracle中
SELECT
CASE
WHEN level = 1
THEN 'HI'
WHEN level = 2
THEN 'BYE'
END TEST
FROM dual
CONNECT BY level <= 2;
SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9
下面介绍如何使用DB2的XML特性来实现这一点
SELECT *
FROM
XMLTABLE ('$doc/ROWSET/ROW' PASSING XMLPARSE ( DOCUMENT '
<ROWSET>
<ROW>
<A val="1" /> <B val="2" /> <C val="3" />
</ROW>
<ROW>
<A val="4" /> <B val="5" /> <C val="6" />
</ROW>
<ROW>
<A val="7" /> <B val="8" /> <C val="9" />
</ROW>
</ROWSET>
') AS "doc"
COLUMNS
"A" INT PATH 'A/@val',
"B" INT PATH 'B/@val',
"C" INT PATH 'C/@val'
)
AS X
;
在Oracle SQL中,您可以使用JSON_TABLE从JSON创建表:
SELECT
t.emp_name,
t.emp_age
FROM
JSON_TABLE (
'{
"employees": [{name:"Alice", age: 19}, {name: "Bob", age: 23}]
}',
'$'
COLUMNS (
NESTED PATH '$.employees[*]'
COLUMNS (
emp_name VARCHAR2(50) PATH '$.name',
emp_age NUMBER(3,0) PATH '$.age'
)
)
) t;