Dependendo do DBMS, um ou mais dos seguintes funcionarão:
SELECT NULL LIMIT 0
(Sintaxe PostgreSQL e MySQL) /SELECT TOP 0 1
(Sintaxe do MS SQL Server)SELECT NULL WHERE FALSE
(DBMS com um tipo booleano, por exemplo, PostgreSQL)SELECT NULL WHERE 1=0
(a maioria dos SGBDs)
Para Oracle, eles precisam estar no formato
SELECT NULL FROM DUAL
, acredito, pois você não pode ter SELECT
sem um FROM
cláusula de algum tipo; não tenho certeza de quais versões do LIMIT
/ TOP
e WHERE
ele vai aceitar. Uma opção mais elaborada é criar uma tabela (temporária) e não inserir nenhuma linha nela, o que pode fornecer qualquer número de colunas, que terão tipos associados mesmo que não contenham valores:
-- 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;
No PostgreSQL, você pode até criar uma tabela sem colunas, permitindo que você tenha um conjunto de resultados com zero linhas e zero colunas :
CREATE TEMP TABLE empty ();
SELECT * FROM empty;
Outra possibilidade é que, se o SGBD tiver funções de retorno de conjunto, elas poderão retornar um conjunto vazio. Por exemplo, novamente no PostgreSQL, pois é o que eu conheço melhor, você pode fornecer um intervalo inválido para
generate_series()
:SELECT * FROM generate_series(0,-1);