选择常量而不引用表在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列的结果集。
Answers:
在中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
。
SELECT 1
在Oracle中做(SELECT 1 FROM Dual
有效)。
尝试在oracle中使用connect by子句,类似这样
select level,level+1,level+2 from dual connect by level <=3;
有关connect by子句的更多信息,请单击以下链接:删除的URL,因为oraclebin网站现在是恶意的。
对于Microsoft SQL Server或PostgreSQL,您可能需要尝试以下语法
SELECT constants FROM (VALUES ('foo@gmail.com'), ('bar@gmail.com'), ('baz@gmail.com')) AS MyTable(constants)
您也可以在此处查看SQL Fiddle:http://www.sqlfiddle.com/#!17 / 9eecb / 34703/0
甲骨文 感谢这篇文章PL / SQL-在“子句中的位置”中使用“列表”变量
我将示例语句放在一起,以轻松地手动输入值(在测试人员对应用程序进行测试时可以重复使用):
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 );
合并仅插入原始表中缺少的行,如果要重新运行插入脚本,这将很方便。
DB2的一个选项:
SELECT 101 AS C1, 102 AS C2 FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT 201 AS C1, 202 AS C2 FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT 301 AS C1, 302 AS C2 FROM SYSIBM.SYSDUMMY1
这是使用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
;
在MySQL中,您可以执行以下操作: values (1,2), (3, 4);
mysql> values (1,2), (3, 4);
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
2 rows in set (0.004 sec)
使用MySQL 8,也可以指定列名称:
mysql> SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d);
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+