是否存在始终返回零结果的SQL查询?

时间:2013-08-02 16:30:21

标签: mysql sql database postgresql

如果有MySQL / PostgreSQL / Oracle特定的解决方案,我对它们都很好奇。

6 个答案:

答案 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 / TOPWHERE的哪个版本。

更复杂的选项是创建一个(临时)表,而不是在其中插入任何行,这可以为您提供任意数量的列,即使它们不包含任何值,也会关联类型:

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