web-dev-qa-db-ja.com

定数で満たされた複数の行を選択する方法は?

テーブルを参照せずに定数を選択することは、SQLステートメントでは完全に正当です。

SELECT 1, 2, 3

後者が返す結果セットは、値を含む単一の行です。定数式を使用して複数の行を一度に選択する方法があるかどうか疑問に思っていました:

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

上記のように機能し、3行3列の結果セットを返すものが必要です。

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

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 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で。

104
Quassnoi

次のようなOracleのconnect by句を試してください。

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

Connect by句の詳細については、次のリンクを参照してください。Oraclebinサイトは悪意があるため、URLを削除しました。

11
Sushant Butta

以下のベアVALUESコマンドは、PostgreSQLで機能します。

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

オラクル。この投稿に感謝 PL/SQL-Where In Clauseで「リスト」変数を使用

サンプルステートメントをまとめて、手動で値を簡単に入力します(テスターに​​よるアプリケーションのテストで再利用されます)。

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

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/

4
bigtunacan

ここでは、きちんとした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 );

マージでは、元のテーブルにない行のみが挿入されます。これは、挿入スクリプトを再実行する場合に便利です。

4
SELECT * 
FROM DUAL 
CONNECT BY ROWNUM <= 9;
4
grokster

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
1

この方法はあなたを助けることができます

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列目と列を連結することにより、結果セットに変化をもたらすことができます。

0
Lali

Oracleで

SELECT
  CASE
    WHEN level = 1
    THEN 'HI'
    WHEN level = 2
    THEN 'BYE'
  END TEST
FROM dual
  CONNECT BY level <= 2;
0
Mike Robert
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;
0
Dejoto

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
;
0
Stavr00

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