4

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

4

6 回答 6

8

根据 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)

对于甲骨文,我相信,这些将需要是形式,因为没有某种子句SELECT NULL FROM DUAL就不能拥有;不确定/的哪个版本,它会接受。SELECTFROMLIMITTOPWHERE

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

-- 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);
于 2013-08-02T16:40:22.860 回答
4

至少在 MySQL/PostgreSQL 中:

SELECT 1 LIMIT 0
于 2013-08-02T16:33:47.087 回答
2

一个永远等同于不可能的地方的价值。

Where 1 = 0
Where 'a' = 'b'

等等等等

于 2013-08-02T16:47:00.343 回答
2
select *
from atable
where 1=2
于 2013-08-02T16:31:45.117 回答
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;
于 2013-08-02T16:47:41.923 回答
0

在 PostgreSQL 中,您可以:

select
  * 
from
  table 
  join another_table on (false)

这是有效的,因为on()应该有布尔表达式。有了falsejoin就可以永远true

于 2013-08-02T19:22:35.613 回答