如果有特定于 MySQL/PostgreSQL/Oracle 的解决方案,我对它们都很好奇。
问问题
3779 次
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
就不能拥有;不确定/的哪个版本,它会接受。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);
于 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()
应该有布尔表达式。有了false
join就可以永远true
。
于 2013-08-02T19:22:35.613 回答