在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列的结果集。
当前回答
下面的裸值命令为我在PostgreSQL工作:
VALUES (1,2,3), (4,5,6), (7,8,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。
使用SQLite3,下面选择Go .QueryContext()
VALUES (1), (2)
返回名为“Column1”的单个未类型化列 还有两行值分别为1和2
VALUES是简单SELECT语句的特殊形式 https://www.sqlite.org/lang_select.html#simpleselect
SELECT *
FROM DUAL
CONNECT BY ROWNUM <= 9;
Oracle。 感谢这篇文章PL/SQL -在Where in子句中使用“List”变量
我把我的示例语句放在一起,以便轻松地手动输入值(测试人员在测试应用程序时重用):
WITH prods AS (
SELECT column_value AS prods_code
FROM TABLE(
sys.odcivarchar2list(
'prod1',
'prod2'
)
)
)
SELECT * FROM prods
下面是我如何使用一个简洁的XML技巧在Oracle 10+中填充静态数据。
create table prop
(ID NUMBER,
NAME varchar2(10),
VAL varchar2(10),
CREATED timestamp,
CONSTRAINT PK_PROP PRIMARY KEY(ID)
);
merge into Prop p
using (
select
extractValue(value(r), '/R/ID') ID,
extractValue(value(r), '/R/NAME') NAME,
extractValue(value(r), '/R/VAL') VAL
from
(select xmltype('
<ROWSET>
<R><ID>1</ID><NAME>key1</NAME><VAL>value1</VAL></R>
<R><ID>2</ID><NAME>key2</NAME><VAL>value2</VAL></R>
<R><ID>3</ID><NAME>key3</NAME><VAL>value3</VAL></R>
</ROWSET>
') xml from dual) input,
table(xmlsequence(input.xml.extract('/ROWSET/R'))) r
) p_new
on (p.ID = p_new.ID)
when not matched then
insert
(ID, NAME, VAL, CREATED)
values
( p_new.ID, p_new.NAME, p_new.VAL, SYSTIMESTAMP );
merge只插入原始表中缺少的行,这很方便 如果您想重新运行插入脚本。