Bagaimana cara memilih beberapa baris yang diisi dengan konstanta?

176

Memilih konstanta tanpa merujuk ke tabel adalah sah secara hukum dalam pernyataan SQL:

SELECT 1, 2, 3

Hasil menetapkan bahwa yang terakhir mengembalikan adalah baris tunggal yang berisi nilai-nilai. Saya bertanya-tanya apakah ada cara untuk memilih beberapa baris sekaligus menggunakan ekspresi konstan, semacam:

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

Saya ingin sesuatu seperti di atas yang berfungsi dan mengembalikan set hasil dengan 3 baris dan 3 kolom.

Buyuciev Blagovest
sumber
1
Sintaks imajiner Anda di atas lebih cantik (dan lebih konsisten dengan INSERT INTO) daripada sintaksis resmi. Katakan saja.
Pete Alvin
2
@PeteAlvin Sintaks yang dibayangkan sudah memiliki arti dalam Postgres (satu baris dengan tuple dipilih).
Kirill Bulygin
2
Sql server jawaban di bawah ini berfungsi dengan baik untuk sql server, dan hampir cocok dengan sintaks ini. stackoverflow.com/a/53269562/2129481
BenPen

Jawaban:

203
SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9
Dewfy
sumber
2
Saya menggunakan ini dengan SQL Server dan bekerja, tapi aku harus menggunakan ASuntuk memberikan alias pada pertamaSELECT
Sled
terima kasih @ArtB, komentar ini dapat membantu pengembang lain untuk mendapatkan sintaks yang benar
Dewfy
3
Juga berfungsi sempurna di Oracle APEX 5.1 untuk membuat Classic Reporttabel dengan konten statis, jika selesai dengan nilai FROM dualsetelahnya SELECT, dan sebelum UNION ALLjika ada.
VELFR
118

Di PostgreSQL, Anda dapat melakukan:

SELECT  *
FROM    (
        VALUES
        (1, 2),
        (3, 4)
        ) AS q (col1, col2)

Di sistem lain, cukup gunakan 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

Di Oracle, SQL Serverdan PostgreSQL, Anda juga dapat menghasilkan set rekaman dari jumlah baris sewenang-wenang (dapat disediakan dengan variabel eksternal):

SELECT  level
FROM    dual
CONNECT BY
        level <= :n

di 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

di SQL Server,

SELECT  l
FROM    generate_series(1, $n) l

di PostgreSQL.

Quassnoi
sumber
1
+1 untuk menjawab pertanyaan (sedikit berbeda) yang saya miliki: bagaimana melakukannya SELECT 1di Oracle ( SELECT 1 FROM Dualberhasil).
Aasmund Eldhuset
13

VALUESPerintah telanjang berikut berfungsi untuk saya di PostgreSQL:

VALUES (1,2,3), (4,5,6), (7,8,9)
Tregoreg
sumber
1
Bekerja di T-SQL sebagai klausa penyisipan multi-baris juga. Memasukkan ke dalam variabel tabel atau tabel sementara pertama bisa berfungsi, tetapi beberapa langkah.
brianary
12

Coba hubungkan dengan klausa di oracle, sesuatu seperti ini

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

Untuk informasi lebih lanjut tentang terhubung dengan klausa, ikuti tautan ini: menghapus URL karena situs oraclebin sekarang berbahaya.

Sushant Butta
sumber
8

Untuk Microsoft SQL Server atau PostgreSQL Anda mungkin ingin mencoba sintaks ini

SELECT constants FROM (VALUES ('[email protected]'), ('[email protected]'), ('[email protected]')) AS MyTable(constants)

Anda juga dapat melihat SQL Fiddle di sini: http://www.sqlfiddle.com/#!17/9eecb/34703/0

bigtunacan
sumber
1
Ini benar-benar berfungsi di SQL server 2010. Beberapa kolom juga: konstanta SELECT, email FROM (VALUES (1, 'foo @ gmail.com'), (2, 'bar @ gmail.com'), (3, 'baz @ gmail .com ')) SEBAGAI MyTable (konstanta, email)
BenPen
7

Peramal. Berkat posting ini PL / SQL - Gunakan Variabel "Daftar" di Where In Clause

Saya mengumpulkan contoh pernyataan saya untuk dengan mudah memasukkan nilai secara manual (digunakan kembali dalam menguji suatu aplikasi oleh penguji):

WITH prods AS (
    SELECT column_value AS prods_code 
    FROM TABLE(
        sys.odcivarchar2list(
            'prod1', 
            'prod2'
        )
    )
)
SELECT * FROM prods
Petr Szturc
sumber
1
Ini adalah penyelamat. Satu hal yang perlu diperhatikan: Jika Anda mengalami kesalahan nilai terlalu banyak, Anda bisa melakukan UNION ALL di klausa WITH.
ScrappyDev
5
SELECT * 
FROM DUAL 
CONNECT BY ROWNUM <= 9;
pengemis
sumber
4

Inilah cara saya mengisi data statis di Oracle 10+ menggunakan trik XML yang rapi.

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

Penggabungan hanya menyisipkan baris yang hilang di tabel asli, yang nyaman jika Anda ingin menjalankan kembali skrip sisipan Anda.

Nicholas Sushkin
sumber
3

Opsi untuk 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
Vitaliy Ulantikov
sumber
0

Di Oracle

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

Berikut ini cara melakukannya menggunakan fitur XML dari 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
;
Stavr00
sumber
0

Cara ini dapat membantu Anda

SELECT   TOP 3
         1 AS First, 
         2 AS Second, 
         3 AS Third 
FROM     Any_Table_In_Your_DataBase

Any_Table_In_Your_DataBase:tabel apa pun yang berisi lebih dari 3 catatan, atau menggunakan tabel sistem apa pun. Di sini kami tidak memiliki perhatian dengan data dari tabel itu.

Anda bisa membawa variasi dalam hasil yang ditetapkan dengan menggabungkan kolom dengan kolom Pertama, Kedua dan Ketiga dari Any_Table_In_Your_DataBasetabel.

Lali
sumber
Anda harus menentukan basis data mana yang Anda gunakan. Kata kunci 'TOP' tidak berfungsi dengan Oracle.
Hans Deragon
0

Di MySQL, Anda dapat melakukan: values (1,2), (3, 4);

mysql> values (1,2), (3, 4);
+---+---+
| 1 | 2 |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
2 rows in set (0.004 sec)

Dengan MySQL 8, Anda juga dapat memberikan nama kolom:

mysql> SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d);
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+
Benedikt Köppel
sumber
1
versi mysql apa yang Anda pakai untuk "values ​​(1,2), (3, 4);"?
Rene Wooller
Apakah itu contoh kedua sebenarnya masih memilih beberapa baris? Juga tak satu pun dari mereka tampaknya dapat dijalankan sebagai pertanyaan di PhpMyAdmin .. Saya berharap saya bisa memberi tahu Anda versi MySQL mana yang saya gunakan, tetapi versi MySQL sangat membingungkan, dan saya yakin pada saat saya mengetahuinya, saya akan keluar dari waktu untuk mengedit komentar ini ...
still_dreaming_1
0
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;

sesuatu seperti itu

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;
Dejoto
sumber