首页 文章

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

提问于
浏览
135

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

SELECT 1, 2, 3

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

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

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

13 回答

  • 11

    以下是如何使用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
    ;
    
  • 1
    SELECT 1, 2, 3
    UNION ALL SELECT 4, 5, 6
    UNION ALL SELECT 7, 8, 9
    
  • 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
    

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

    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 .

  • 2

    尝试使用oracle中的connect by子句,类似这样

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

    有关connect by子句的更多信息,请访问以下链接:删除URL,因为oraclebin站点现在是恶意的 .

  • 164

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

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

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

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

  • 0

    甲骨文 . 感谢这篇文章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
    
  • 3
    SELECT * 
    FROM DUAL 
    CONNECT BY ROWNUM <= 9;
    
  • 98

    对于Microsoft SQL Server,您可能需要尝试此语法

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

  • 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
    
  • 4

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

    在Oracle中

    SELECT
      CASE
        WHEN level = 1
        THEN 'HI'
        WHEN level = 2
        THEN 'BYE'
      END TEST
    FROM dual
      CONNECT BY level <= 2;
    
  • 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 表中的第一,第二和第三列连接来使结果集中的变体带来 .

相关问题