Как выбрать несколько строк, заполненных константами?

Выбор констант без ссылки на таблицу является совершенно законным в выражении SQL:

SELECT 1, 2, 3

Набор результатов, который возвращает последний, представляет собой одну строку, содержащую значения. Мне было интересно, есть ли способ выбрать несколько строк сразу, используя константное выражение, что-то вроде:

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

Я хотел бы, чтобы что-то вроде выше работало и возвращает набор результатов с 3 строками и тремя столбцами.

Ответ 1

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

Ответ 2

В 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.

Ответ 3

Попробуйте выполнить предложение connect by oracle, что-то вроде этого

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

Для получения дополнительной информации о соединении по предложению перейдите по этой ссылке: удаленный URL-адрес, поскольку сайт oraclebin теперь злонамерен.

Ответ 4

Следующая команда VALUES работает для меня в PostgreSQL:

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

Ответ 5

Oracle. Благодаря этому посту PL/SQL - используйте переменную "List" в пункте Where In

Я собрал свой пример, чтобы легко вводить значения вручную (будучи использованным при тестировании приложения тестерами):

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

Ответ 6

Вот как я заполняю статические данные в Oracle 10+, используя аккуратный трюк XML.

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

Слияние только вставляет строки, отсутствующие в исходной таблице, что удобно если вы хотите повторно запустить свою вставку script.

Ответ 7

SELECT * 
FROM DUAL 
CONNECT BY ROWNUM <= 9;

Ответ 9

Опция для 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

Ответ 10

В Oracle

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

Ответ 11

Вот как это сделать, используя функции XML DB2

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

Этот способ может помочь вам

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

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

Ответ 14

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;