テーブルを参照せずに定数を選択することは、SQLステートメントでは完全に正当です。
SELECT 1, 2, 3
後者が返す結果セットは、値を含む単一の行です。定数式を使用して複数の行を一度に選択する方法があるかどうか疑問に思っていました:
SELECT ((1, 2, 3), (4, 5, 6), (7, 8, 9))
上記のように機能し、3行3列の結果セットを返すものが必要です。
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
で。
次のようなOracleのconnect by句を試してください。
select level,level+1,level+2 from dual connect by level <=3;
Connect by句の詳細については、次のリンクを参照してください。Oraclebinサイトは悪意があるため、URLを削除しました。
以下のベアVALUES
コマンドは、PostgreSQLで機能します。
VALUES (1,2,3), (4,5,6), (7,8,9)
オラクル。この投稿に感謝 PL/SQL-Where In Clauseで「リスト」変数を使用
サンプルステートメントをまとめて、手動で値を簡単に入力します(テスターによるアプリケーションのテストで再利用されます)。
WITH prods AS (
SELECT column_value AS prods_code
FROM TABLE(
sys.odcivarchar2list(
'prod1',
'prod2'
)
)
)
SELECT * FROM prods
Microsoft SQL ServerまたはPostgreSQLの場合、この構文を試してください。
SELECT constants FROM (VALUES ('[email protected]'), ('[email protected]'), ('[email protected]')) AS MyTable(constants)
SQL Fiddleをここで表示することもできます: http://www.sqlfiddle.com/#!17/9eecb/34703/
ここでは、きちんとした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 );
マージでは、元のテーブルにない行のみが挿入されます。これは、挿入スクリプトを再実行する場合に便利です。
SELECT *
FROM DUAL
CONNECT BY ROWNUM <= 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
この方法はあなたを助けることができます
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
テーブルの1列目、2列目、3列目と列を連結することにより、結果セットに変化をもたらすことができます。
Oracleで
SELECT
CASE
WHEN level = 1
THEN 'HI'
WHEN level = 2
THEN 'BYE'
END TEST
FROM dual
CONNECT BY level <= 2;
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;
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
;
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 |
+---+---+---+---+