如何选择填充常量的多行?

时间:2010-02-04 16:11:42

标签: sql select constants

在SQL语句中选择常量而不引用表是完全合法的:

SELECT 1, 2, 3

后者返回的结果集是包含值的单行。我想知道是否有办法使用常量表达式一次选择多行:

SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))

我希望像上面这样的东西起作用并返回一个包含3行和3列的结果集。

15 个答案:

答案 0 :(得分:165)

SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9

答案 1 :(得分:100)

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

OracleSQL ServerPostgreSQL中,您还可以生成任意行数的记录集(可通过外部变量提供):

SELECT  level
FROM    dual
CONNECT BY
        level <= :n
<{1>}中的

Oracle
<{1>}中的

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中的

答案 2 :(得分:11)

在oracle中尝试connect by子句,类似这样

select level,level+1,level+2 from dual connect by level <=3;

有关connect by子句的详细信息,请访问以下链接:删除了URL,因为oraclebin网站现在是恶意的。

答案 3 :(得分:11)

以下VALUES命令在PostgreSQL中为我工作:

VALUES (1,2,3), (4,5,6), (7,8,9)

答案 4 :(得分:4)

以下是使用简洁的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 );

合并仅插入原始表中缺少的行,这很方便 如果你想重新运行你的插入脚本。

答案 5 :(得分:4)

SELECT * 
FROM DUAL 
CONNECT BY ROWNUM <= 9;

答案 6 :(得分:4)

的Oracle。 感谢此帖PL/SQL - Use "List" Variable in Where In Clause

我将我的示例语句放在一起,以便轻松地手动输入值(在测试人员测试应用程序时重复使用):

WITH prods AS (
    SELECT column_value AS prods_code 
    FROM TABLE(
        sys.odcivarchar2list(
            'prod1', 
            'prod2'
        )
    )
)
SELECT * FROM prods

答案 7 :(得分:2)

对于Microsoft SQL Server,您可能需要尝试使用这种语法

SELECT constants FROM (VALUES ('foo@gmail.com'), ('bar@gmail.com'), ('baz@gmail.com')) AS MyTable(constants)

答案 8 :(得分:1)

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

答案 9 :(得分:1)

在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 |
+---+---+---+---+

答案 10 :(得分:0)

在Oracle中

SELECT
  CASE
    WHEN level = 1
    THEN 'HI'
    WHEN level = 2
    THEN 'BYE'
  END TEST
FROM dual
  CONNECT BY level <= 2;

答案 11 :(得分:0)

以下是使用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
;

答案 12 :(得分:0)

这种方式可以帮助你

SELECT   TOP 3
         1 AS First, 
         2 AS Second, 
         3 AS Third 
FROM     Any_Table_In_Your_DataBase

Any_Table_In_Your_DataBase:任何包含3条以上记录的表,或使用任何系统表。在这里,我们不关心该表的数据。

您可以通过将列与Any_Table_In_Your_DataBase表中的第一,第二和第三列连接来为结果集带来变化。

答案 13 :(得分:0)

select (level - 1) * row_dif + 1 as a, (level - 1) * row_dif + 2 as b, (level - 1) * row_dif + 3 as c
    from dual 
    connect by level <= number_of_rows;

类似的东西

select (level - 1) * 3 + 1 as a, (level - 1) * 3 + 2 as b, (level - 1) * 3 + 3 as c
    from dual 
    connect by level <= 3;

答案 14 :(得分:0)

这是一种直接通过MySQL请求SELECT创建自定义行的方法:

SELECT ALL *
FROM (
    VALUES
        ROW (1, 2, 3),
        ROW (4, 5, 6),
        ROW (7, 8, 9)
) AS dummy (c1, c2, c3)

给我们一个表dummy

c1   c2   c3
-------------
 1    2    3
 4    5    6
 7    8    9

经过MySQL 8

的测试