Làm thế nào để chọn nhiều hàng chứa đầy hằng?


176

Chọn các hằng số mà không tham khảo bảng là hoàn toàn hợp pháp trong câu lệnh SQL:

SELECT 1, 2, 3

Tập kết quả mà trả về sau là một hàng chứa các giá trị. Tôi đã tự hỏi nếu có một cách để chọn nhiều hàng cùng một lúc bằng cách sử dụng một biểu thức không đổi, một loại nào đó:

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

Tôi muốn một cái gì đó giống như ở trên hoạt động và trả về một tập kết quả với 3 hàng và 3 cột.


1
Cú pháp tưởng tượng của bạn ở trên đẹp hơn (và phù hợp hơn với INSERT INTO) so với cú pháp chính thức. Chỉ cần nói.
Pete Alvin

2
@PeteAlvin Cú pháp tưởng tượng đã có nghĩa trong Postgres (một hàng duy nhất với một tuple được chọn).
Kirill Bulygin

2
Câu trả lời của máy chủ sql dưới đây hoạt động tốt cho máy chủ sql và gần như phù hợp với cú pháp này. stackoverflow.com/a/53269562/2129481
BenPen

Câu trả lời:


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

2
Tôi đã sử dụng cái này với SQL Server và nó đã hoạt động, nhưng tôi phải sử dụng ASđể đặt bí danh cho lần đầu tiênSELECT
Sled

cảm ơn bạn @ArtB, nhận xét này có thể giúp các nhà phát triển khác có được cú pháp chính xác
Dewfy

3
Cũng hoạt động hoàn hảo trong Oracle APEX 5.1 để tạo Classic Reportcác bảng có nội dung tĩnh, nếu được hoàn thành FROM dualsau mỗi SELECTgiá trị và trước UNION ALLnếu có.
VELFR

118

Trong PostgreSQL, bạn có thể làm:

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

Trong các hệ thống khác, chỉ cần sử dụng 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

Trong Oracle, SQL ServerPostgreSQL, bạn cũng có thể tạo ra recordsets số tùy ý của hàng (providable với một biến ngoài):

SELECT  level
FROM    dual
CONNECT BY
        level <= :n

trong 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

trong SQL Server,

SELECT  l
FROM    generate_series(1, $n) l

trong PostgreSQL.


1
+1 để trả lời câu hỏi (hơi khác) tôi đã có: cách thực hiện SELECT 1trong Oracle ( SELECT 1 FROM Dualđã hoạt động).
Aasmund Eldhuset

13

Theo VALUESlệnh trần hoạt động với tôi trong PostgreSQL:

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

1
Cũng hoạt động trong T-SQL như một mệnh đề chèn nhiều hàng. Trước tiên, chèn vào một biến bảng hoặc bảng tạm thời có thể hoạt động, nhưng nhiều bước.
brianary

12

Hãy thử kết nối bằng mệnh đề trong oracle, đại loại như thế này

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

Để biết thêm thông tin về kết nối theo mệnh đề, hãy theo liên kết sau: URL đã bị xóa vì trang web oraclebin hiện độc hại.


8

Đối với Microsoft SQL Server hoặc PostgreSQL, bạn có thể muốn thử cú pháp này

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

Bạn cũng có thể xem Fiddle SQL tại đây: http://www.sqlfiddle.com/#!17/9eecb 432703/0


1
Điều này hoàn toàn hoạt động trong máy chủ SQL 2010. Cũng có nhiều cột: CHỌN hằng, email TỪ (GIÁ TRỊ (1, 'foo @ gmail.com'), (2, 'bar @ gmail.com'), (3, 'baz @ gmail .com ')) NHƯ MyTable (hằng số, email)
BenPen

7

Oracle. Nhờ bài đăng này PL / SQL - Sử dụng biến "Danh sách" trong trường hợp trong khoản

Tôi kết hợp câu lệnh ví dụ của mình để dễ dàng nhập các giá trị thủ công (được sử dụng lại để kiểm tra ứng dụng bởi người kiểm tra):

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

1
Đây là một cứu tinh. Một điều cần lưu ý: Nếu bạn gặp phải lỗi quá nhiều giá trị, bạn có thể thực hiện một UNION ALL trong mệnh đề VỚI.
ScrappyDev


4

Đây là cách tôi điền dữ liệu tĩnh trong Oracle 10+ bằng cách sử dụng thủ thuật XML gọn gàng.

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

Hợp nhất chỉ chèn các hàng bị thiếu trong bảng gốc, thuận tiện nếu bạn muốn chạy lại tập lệnh chèn của mình.


3

Một tùy chọn cho 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

0

Trong Oracle

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

0

Đây là cách thực hiện bằng các tính năng XML của 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
;

0

Cách này có thể giúp bạn

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

Any_Table_In_Your_DataBase:bất kỳ bảng nào chứa nhiều hơn 3 bản ghi hoặc sử dụng bất kỳ bảng hệ thống nào. Ở đây chúng tôi không có mối quan tâm với dữ liệu của bảng đó.

Bạn có thể mang các biến thể trong tập kết quả bằng cách nối một cột với các cột Đầu tiên, Thứ hai và Thứ ba từ Any_Table_In_Your_DataBasebảng.


Bạn nên chỉ định cơ sở dữ liệu nào bạn sử dụng. Từ khóa 'TOP' không hoạt động với Oracle.
Hans Deragon

0

Trong MySQL, bạn có thể làm: values (1,2), (3, 4);

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

Với MySQL 8, bạn cũng có thể đặt tên cột:

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

1
phiên bản nào của mysql cho "giá trị (1,2), (3, 4);"?
Rene Wooller

Đó có phải là ví dụ thứ hai thực sự vẫn chọn nhiều hàng không? Ngoài ra, cả hai dường như không thể chạy được như các truy vấn trong PhpMyAdmin .. Tôi ước tôi có thể cho bạn biết tôi đang dùng phiên bản MySQL nào, nhưng các phiên bản MySQL rất khó hiểu và tôi chắc chắn rằng khi tôi tìm ra nó, tôi sẽ đã hết thời gian để chỉnh sửa nhận xét này ...
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;

một cái gì đó như thế

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.