Selon le SGBD, un ou plusieurs des éléments suivants fonctionneront :
SELECT NULL LIMIT 0
(Syntaxe PostgreSQL et MySQL) /SELECT TOP 0 1
(syntaxe MS SQL Server)SELECT NULL WHERE FALSE
(SGBD de type booléen, par exemple PostgreSQL)SELECT NULL WHERE 1=0
(la plupart des SGBD)
Pour Oracle, ceux-ci devront être de la forme SELECT NULL FROM DUAL
, je crois, car vous ne pouvez pas avoir SELECT
sans FROM
clause quelconque ; je ne sais pas quelles versions de LIMIT
/ TOP
et WHERE
il acceptera.
Une option plus élaborée consiste à créer une table (temporaire) et à ne pas y insérer de lignes, ce qui peut vous donner n'importe quel nombre de colonnes, auxquelles seront associés des types même s'ils ne contiennent aucune valeur :
-- PostgreSQL
CREATE TEMP TABLE dummy ( a Int, b VarChar(42) );
SELECT * FROM dummy;
-- MS SQL Server
CREATE TABLE #DUMMY ( a Int, b VarChar(42) );
SELECT * FROM #DUMMY;
Dans PostgreSQL, vous pouvez même créer une table sans colonnes, ce qui vous permet d'avoir un jeu de résultats avec zéro ligne et zéro colonne :
CREATE TEMP TABLE empty ();
SELECT * FROM empty;
Une autre possibilité est que si le SGBD a des fonctions de retour d'ensemble, elles peuvent être en mesure de renvoyer un ensemble vide. Par exemple, encore une fois dans PostgreSQL car c'est ce que je connais le mieux, vous pouvez donner une plage invalide à generate_series()
:
SELECT * FROM generate_series(0,-1);