如果有MySQL / PostgreSQL / Oracle特定的解决方案,我对它们都很好奇。
答案 0 :(得分:7)
根据DBMS的不同,以下一项或多项措施可以使用:
SELECT NULL LIMIT 0
(PostgreSQL和MySQL语法)/ SELECT TOP 0 1
(MS SQL Server语法)SELECT NULL WHERE FALSE
(带有布尔类型的DBMS,例如PostgreSQL)SELECT NULL WHERE 1=0
(大多数DBMS)对于Oracle,我认为这些形式必须采用SELECT NULL FROM DUAL
形式,因为如果没有某种SELECT
条款,您就不能拥有FROM
;不确定它会接受LIMIT
/ TOP
和WHERE
的哪个版本。
更复杂的选项是创建一个(临时)表,而不是在其中插入任何行,这可以为您提供任意数量的列,即使它们不包含任何值,也会关联类型:
-- 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;
在PostgreSQL中,您甚至可以创建一个没有列的表,允许您拥有零行和零列的结果集:
CREATE TEMP TABLE empty ();
SELECT * FROM empty;
另一种可能性是,如果DBMS具有设置返回功能,则它们可能能够返回空集。例如,再次在PostgreSQL中,因为它是我最熟悉的,你可以给generate_series()
无效范围:
SELECT * FROM generate_series(0,-1);
答案 1 :(得分:4)
至少在MySQL / PostgreSQL中:
SELECT 1 LIMIT 0
答案 2 :(得分:2)
select *
from atable
where 1=2
答案 3 :(得分:2)
一个值总是等于不可能的值。
Where 1 = 0
Where 'a' = 'b'
等等
答案 4 :(得分:1)
有各种答案:
SELECT 1 LIMIT 0
SELECT 1 FROM DUAL WHERE 1=0
但请注意,即使行数为0,列中的列数。
例如:
INSERT INTO t(a,b) SELECT 1 LIMIT 0;
!! Error: Column count doesn't match value count at row 1
你必须写:
INSERT INTO t(a,b) SELECT 1,1 LIMIT 0;
答案 5 :(得分:0)
在PostgreSQL中你可以:
select
*
from
table
join another_table on (false)
这是有效的,因为在on()
中应该有布尔expression。使用false
,联接可以永远不会true
。