web-dev-qa-db-fra.com

Comment sélectionner plusieurs lignes remplies de constantes?

La sélection de constantes sans faire référence à une table est parfaitement légale dans une instruction SQL:

SELECT 1, 2, 3

Le résultat renvoyé par ce dernier est une seule ligne contenant les valeurs. Je me demandais s'il y avait un moyen de sélectionner plusieurs lignes à la fois en utilisant une expression constante, une sorte de:

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

Je voudrais quelque chose comme ci-dessus qui fonctionne et retourne un ensemble de résultats avec 3 lignes et 3 colonnes.

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

Dans PostgreSQL, vous pouvez faire:

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

Dans d'autres systèmes, utilisez simplement 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

Dans Oracle, SQL Server et PostgreSQL, vous pouvez également générer des jeux d'enregistrements contenant un nombre arbitraire de lignes (fournis avec une variable externe):

SELECT  level
FROM    dual
CONNECT BY
        level <= :n

dans 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

dans SQL Server,

SELECT  l
FROM    generate_series(1, $n) l

dans PostgreSQL.

104
Quassnoi

Essayez la clause connect by dans Oracle, quelque chose comme ça

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

Pour plus d'informations sur la clause connect by, suivez ce lien: URL supprimée car le site oraclebin est désormais malveillant.

11
Sushant Butta

Suivre la commande nue VALUES fonctionne pour moi dans PostgreSQL:

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

Voici comment peupler des données statiques dans Oracle 10+ à l'aide d'une astuce XML ordonnée.

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

La fusion insère uniquement les lignes manquantes dans la table d'origine, ce qui est pratique si vous souhaitez réexécuter votre script d'insertion.

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

Oracle . Merci pour cet article PL/SQL - Utiliser la variable "List" dans la clause Where In

J'ai rassemblé mon exemple d'instruction qui permet de saisir manuellement des valeurs (réutilisées lors du test d'une application par les testeurs):

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

Dans MySQL, vous pouvez faire: values (1,2), (3, 4);

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

Avec MySQL 8, il est également possible de donner les noms de colonnes:

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

Une option pour 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
Vitaliy Ulantikov

De cette façon peut vous aider

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

Any_Table_In_Your_DataBase: toute table contenant plus de 3 enregistrements ou toute table système. Ici, nous ne nous inquiétons pas des données de cette table.

Vous pouvez modifier le jeu de résultats en concaténant une colonne avec les colonnes First, Second et Third de la table Any_Table_In_Your_DataBase.

0
Lali

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

quelque chose comme ca

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

Voici comment procéder à l'aide des fonctions XML de 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
Stavr00