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



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



SELECT 1, 2, 3


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



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


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

540   12  

12 ответов:

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

на 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.

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

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

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

следующим голой VALUES команда работает для меня в PostgreSQL:

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

вот как я заполняю статические данные в 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 );

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

SELECT * 
FROM DUAL 
CONNECT BY ROWNUM <= 9;

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

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

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

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

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

В Oracle

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

вот как это сделать, используя 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
;

этот путь может помочь вам

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 таблица.

Comments

    Ничего не найдено.