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

SELECT 1, 2, 3

后者返回的结果集是包含值的单行。我想知道是否有一种方法可以使用常量表达式一次选择多行,类似于:

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

我想要像上面那样工作,并返回一个3行3列的结果集。


在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, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9

下面是我如何使用一个简洁的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只插入原始表中缺少的行,这很方便 如果您想重新运行插入脚本。


试试oracle中的connect by子句,就像这样

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

有关connect by子句的更多信息,请参见此链接:已删除URL,因为oraclebin站点现在是恶意的。


SELECT * 
FROM DUAL 
CONNECT BY ROWNUM <= 9;

下面的裸值命令为我在PostgreSQL工作:

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

在Oracle中

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

下面介绍如何使用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
;

这种方法可以帮助你

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表中的第一列、第二列和第三列来带来结果集的变化。


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

Oracle。 感谢这篇文章PL/SQL -在Where in子句中使用“List”变量

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

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

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

对于Microsoft SQL Server或PostgreSQL,您可能想要尝试此语法

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

你也可以在这里查看一个SQL Fiddle: http://www.sqlfiddle.com/#!17/9eecb / 34703/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;

下面是一种直接用MySQL请求SELECT创建自定义行的方法:

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

给我们一个表假人:

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

用MySQL 8测试


使用SQLite3,下面选择Go .QueryContext()

VALUES (1), (2)

返回名为“Column1”的单个未类型化列 还有两行值分别为1和2

VALUES是简单SELECT语句的特殊形式 https://www.sqlite.org/lang_select.html#simpleselect


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