Question

Je voudrais vraiment savoir s'il est possible de faire une instruction select, qui renvoie exactement les mêmes dossiers que nous mettons dans article?

Exemple:

select * from table
where table_id in (1, 2, 3, 666);

Ce tableau pour un exemple n'a que id-s de 1 à 100, donc ce select retournera seulement trois lignes. Ce que je dois faire, pour obtenir également une ligne (probablement nulle ou factice) pour 666?

Merci!

Était-ce utile?

La solution

Vous pouvez utiliser l'union:

select * from table
where table_id in (1, 2, 3);
union
select 666 as table_id, other_fields_with_dummy_values_in_table from dual;

est de savoir comment vous pouvez le faire dans Oracle. Le from dual peut varier en fonction du système de base de données que vous utilisez.

Il faut juste savoir que si vous utilisez l'union, votre requête factice Vous devez sélectionner les mêmes enregistrements que la requête réelle.

Autres conseils

Vous pouvez sélectionner sans table

Il suffit de faire une union avec votre requête

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'

En supposant un numbers de table contenant tous les numéros, disons, 1-1000000 (suffisamment de fait que votre gamme de valeurs d'entrée est couverte), vous pouvez exécuter l'instruction SQL suivante:

SELECT *
  FROM numbers left outer join table on table.table_id = numbers.number
 WHERE numbers.number in (1, 2, 3, 666)

Si vous utilisez un SGBD qui offre une meilleure solution, comme e. g. SQL Anywhere avec elle procédure de sa_rowgenerator, vous pouvez remplacer la table numbers avec un appel de procédure, et ne pas la limite d'un nombre maximum.

clause de IN est un prédicat booléen, vous aurez donc besoin de le remplacer par un mannequin recordset:

SELECT  m.*
FROM    (
        SELECT  1 AS id
        UNION ALL
        SELECT  2 AS id
        UNION ALL
        SELECT  3 AS id
        UNION ALL
        SELECT  666 AS id
        ) q
LEFT JOIN
        mytable m
ON      m.id = q.id

Dans SQL Server 2008, vous pouvez exécuter cette requête:

SELECT  *
FROM    @mydata d
LEFT JOIN
        mytable t
ON      t.id = d.id

avec @mydate est une variable de table, passée en paramètre à partir du client.

Dans PostgreSQL, vous pouvez exécuter cette requête:

SELECT  *
FROM    (
        SELECT  :arr[s] AS id
        FROM    generate_series(1, array_upper(:arr, 1)) s
        ) q
LEFT JOIN
        mytable t
ON      t.id = q.id

:arr est un [1, 2, 3, 666] de réseau, également transmis à partir du client en tant que paramètre.

Dans Oracle, vous pouvez faire:

SELECT  *
FROM    TABLE(:mycol) q
LEFT JOIN
        mytable t
ON      t.id = q.id

, où :mycol est une variable de type de collection, passé par le client.

Une façon de penser est: vous aurez besoin d'avoir ces données « enter » la requête comme un ensemble de données. Données trouvées dans les clauses where ne sont jamais « ajoutée » à la requête, ils ne sont utilisés que pour filtrer les données existantes sur.

Un exemple rapide:

DECLARE @MustInclude (Value  int  not null)

INSERT @MustInclude (Value) values (1)
INSERT @MustInclude (Value) values (2)
INSERT @MustInclude (Value) values (3)
INSERT @MustInclude (Value) values (666)

SELECT *
 from @MustInclude mi
  left outer join MyTable mt
   on mt.Value = mi.Value
scroll top