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

其他回答

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

VALUES (1), (2)

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

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

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

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

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

在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 (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测试