Как выбрать несколько строк, заполненных константами?
выбор констант без ссылки на таблицу является совершенно законным в инструкции SQL:
SELECT 1, 2, 3
следствием установлено, что последний возвращает одну строку, содержащую значения. Мне было интересно, есть ли способ выбрать несколько строк сразу, используя постоянное выражение, что-то вроде:
SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))
Я хотел бы что-то вроде выше, что работает и возвращает результирующий набор с 3 строками и 3 столбцами.
12 ответов:
на
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 теперь вредоносен.
вот как я заполняю статические данные в 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 );слияние только вставляет строки, которые отсутствуют в исходной таблице, что удобно если вы хотите повторно запустить скрипт вставки.
Оракул. Благодаря этому сообщению 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