wake-up-neo.com

Wie kann man mehrere mit Konstanten gefüllte Zeilen auswählen?

Das Auswählen von Konstanten ohne Bezugnahme auf eine Tabelle ist in einer SQL-Anweisung absolut zulässig:

SELECT 1, 2, 3

Die Ergebnismenge, die der letztere zurückgibt, ist eine einzelne Zeile, die die Werte enthält. Ich habe mich gefragt, ob es eine Möglichkeit gibt, mehrere Zeilen auf einmal mit einem konstanten Ausdruck auszuwählen.

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

Ich möchte so etwas wie das Obige, das funktioniert und eine Ergebnismenge mit 3 Zeilen und 3 Spalten zurückgibt.

131
SELECT 1, 2, 3
UNION ALL SELECT 4, 5, 6
UNION ALL SELECT 7, 8, 9
162
Dewfy

In PostgreSQL können Sie Folgendes tun:

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

Verwenden Sie in anderen Systemen einfach 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

In Oracle, SQL Server und PostgreSQL können Sie auch Recordsets mit einer beliebigen Anzahl von Zeilen generieren (die mit einer externen Variablen versehen werden können):

SELECT  level
FROM    dual
CONNECT BY
        level <= :n

in 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

in SQL Server,

SELECT  l
FROM    generate_series(1, $n) l

in PostgreSQL.

104
Quassnoi

Versuchen Sie es mit der Klausel connect by in Oracle

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

Für weitere Informationen zu connect by-Klausel klicken Sie auf diesen Link: URL wurde entfernt, da die oraclebin-Site jetzt schädlich ist.

11
Sushant Butta

Der folgende Befehl VALUES funktioniert in PostgreSQL für mich:

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

Für Microsoft SQL Server oder PostgreSQL können Sie diese Syntax ausprobieren

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

Sie können auch ein SQL anzeigen Fiddle hier: http://www.sqlfiddle.com/#!17/9eecb/34703/

4
bigtunacan

So fülle ich statische Daten in Oracle 10+ mit einem sauberen XML-Trick aus.

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

Bei der Zusammenführung werden nur die fehlenden Zeilen in die ursprüngliche Tabelle eingefügt. Dies ist praktisch, wenn Sie das Einfügungsskript erneut ausführen möchten.

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

Oracle . Dank dieses Beitrags PL/SQL - Verwenden Sie "List" -Variable in Where In-Klausel

Ich habe meine Beispielaussage zusammengestellt, die einfach manuell eingegeben werden kann (wird beim Testen einer Anwendung von Testern wiederverwendet):

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

In MySQL können Sie Folgendes tun: values (1,2), (3, 4);

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

Mit MySQL 8 können auch die Spaltennamen angegeben werden:

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

Eine Option für 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

Dieser Weg kann Ihnen helfen

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

Any_Table_In_Your_DataBase: eine Tabelle, die mehr als 3 Datensätze enthält, oder eine beliebige Systemtabelle verwenden. Hier haben wir nichts mit den Daten dieser Tabelle zu tun.

Sie können Variationen in der Ergebnismenge erzeugen, indem Sie eine Spalte mit der ersten, zweiten und dritten Spalte der Any_Table_In_Your_DataBase-Tabelle verketten.

0
Lali

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

sowas in der Art

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

Gehen Sie wie folgt vor, um die XML-Funktionen von DB2 zu verwenden 

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