Sabitlerle dolu birden çok satır nasıl seçilir?


176

Bir tabloya başvurmadan sabitleri seçmek bir SQL ifadesinde tamamen yasaldır:

SELECT 1, 2, 3

İkincisinin döndürdüğü sonuç kümesi değerleri içeren tek bir satırdır. Sabit bir ifade kullanarak bir kerede birden çok satır seçmek için bir yol olup olmadığını merak ediyordum:

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

Çalışır ve 3 satır ve 3 sütun içeren bir sonuç kümesi döndüren yukarıdaki gibi bir şey istiyorum.


1
Yukarıdaki hayali sözdiziminiz resmi sözdiziminden daha güzel (ve INSERT INTO ile daha tutarlı). Sadece söylüyorum.
Pete Alvin

2
@PeteAlvin Hayal edilen sözdiziminin Postgres'te zaten bir anlamı var (bir demet içeren tek bir satır seçildi).
Kirill Bulygin

2
Aşağıdaki sql sunucusu yanıtı sql sunucusu için iyi çalışıyor ve neredeyse bu sözdizimiyle eşleşiyor. stackoverflow.com/a/53269562/2129481
BenPen

Yanıtlar:


203
SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9

2
Bunu SQL Server ile kullandım ve işe yaradı, ancak ASilk olarak takma ad vermek için kullanmak zorunda kaldımSELECT
Kızak

teşekkür ederim @ArtB, bu yorum diğer geliştiricilerin doğru sözdizimi
almasına

3
Ayrıca Oracle APEX 5.1'de Classic Report, FROM dualher biri sonra tamamlanmışsa SELECT, değerler ve UNION ALLvarsa önce statik içerikli tablolar oluşturmak için mükemmel çalışır .
VELFR

118

İçinde PostgreSQLşunları yapabilirsiniz:

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

Diğer sistemlerde UNION ALLşunları kullanın :

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

In Oracle, SQL Serverve PostgreSQL, ayrıca sıralar (harici bir değişkenle providable) keyfi sayının kayıt kümeleri oluşturabilir:

SELECT  level
FROM    dual
CONNECT BY
        level <= :n

içinde 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

içinde SQL Server,

SELECT  l
FROM    generate_series(1, $n) l

içinde PostgreSQL.


1
+1 (biraz farklı) soruyu cevapladığım için: SELECT 1Oracle'da nasıl SELECT 1 FROM Dualçalıştım ( çalıştı).
Aasmund Eldhuset

13

VALUESPostgreSQL'de şu çıplak komut benim için çalışıyor:

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

1
T-SQL'de de çok satırlı bir ekleme cümlesi olarak çalışır. Öncelikle bir tablo değişkenine veya geçici tabloya eklemek işe yarayabilir, ancak birden çok adım olabilir.
brianary

12

Oracle ile bağlamayı deneyin, böyle bir şey

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

Connect by yan tümcesi hakkında daha fazla bilgi için şu bağlantıyı izleyin: oraclebin sitesi artık kötü amaçlı olduğu için URL kaldırıldı.


8

Microsoft SQL Server veya PostgreSQL için bu sözdizimini denemek isteyebilirsiniz

SELECT constants FROM (VALUES ('foo@gmail.com'), ('bar@gmail.com'), ('baz@gmail.com')) AS MyTable(constants)

Ayrıca bir SQL Fiddle'ı burada da görüntüleyebilirsiniz: http://www.sqlfiddle.com/#!17/9eecb/34703/0


1
Bu kesinlikle SQL Server 2010'da çalışır. Birden fazla sütun da: sabitleri SEÇ, E-postadan (DEĞERLER (1, 'foo @ gmail.com'), (2, 'bar @ gmail.com'), (3, 'baz @ gmail .com ')) AS MyTable (sabitler, e-posta)
BenPen

7

Oracle. Bu yazı sayesinde PL / SQL - Where In Clause içinde "List" Değişkeni Kullan

Ben kolayca manuel olarak değerleri girmek için örnek ifademi bir araya getirdim (bir uygulamanın test kullanıcıları tarafından test edilmesinde yeniden kullanılıyor olmak):

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

1
Bu bir hayat kurtarıcıydı. Dikkat edilmesi gereken bir nokta: Çok fazla değer hatasıyla karşılaşırsanız, WITH yan tümcesinde bir UNION ALL yapabilirsiniz.
ScrappyDev


4

İşte düzgün bir XML hile kullanarak Oracle 10+ statik veri doldurmak nasıl.

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

Birleştirme, yalnızca özgün tabloda eksik olan satırları ekler; bu, ekleme komut dosyanızı yeniden çalıştırmak istiyorsanız kullanışlıdır.


3

DB2 için bir seçenek:

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

0

Oracle'da

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

0

DB2'nin XML özelliklerini kullanarak nasıl yapılacağı aşağıda açıklanmıştır

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

Bu şekilde size yardımcı olabilirsiniz

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

Any_Table_In_Your_DataBase:3'ten fazla kayıt içeren herhangi bir tablo veya herhangi bir sistem tablosu kullanın. Burada bu tablodaki verilerle ilgili bir endişemiz yok.

Bir sütunu Any_Table_In_Your_DataBasetablodaki Birinci, İkinci ve Üçüncü sütunlarla birleştirerek sonuç kümesindeki varyasyonları getirebilirsiniz .


Hangi veritabanını kullandığınızı belirtmelisiniz. 'TOP' anahtar kelimesi Oracle ile çalışmaz.
Hans Deragon

0

MySQL'de şunları yapabilirsiniz: 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 ile sütun adlarını vermek de mümkündür:

mysql> SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d);
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 3 | 4 |
+---+---+---+---+

1
"değerler (1,2), (3, 4);" için hangi mysql sürümünü kullanıyorsunuz?
Rene Wooller

Bu ikinci örnek aslında hala birden çok satır mı seçiyor? Ayrıca ikisi de PhpMyAdmin sorgu olarak çalıştırılabilir görünmüyor .. Keşke size hangi MySQL sürümü olduğumu söyleyebilirdim, ama MySQL sürümleri çok kafa karıştırıcı ve eminim anladığım zaman, ben olacak Bu yorumu düzenlemek için zamanınız
doldu

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;

bunun gibi bir şey

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.