如何选择一个空的结果集?

64

我正在使用MySQL中的存储过程,并有一个CASE语句。

在CASE的ELSE子句(等同于default:),我想选择并返回一个空结果集,从而避免通过不处理ELSE情况来抛出SQL错误,并且返回一个空结果集,就像常规查询没有返回行一样。

到目前为止,我使用了以下内容:
Select NULL From users Where False

但是我必须给现有的表命名,例如在此示例中的“users”。 它起作用,但如果最终使用的表名被重命名或删除,则我希望找到不会破坏它的方法。

我尝试过Select NULL Where False,但它不起作用。

使用Select NULL不会返回空集,而是一行带有名为NULL且具有NULL值的列。


1
你说得对。有很多表存在,问题在于一旦你选择了一个表,如果将来该表被删除或重命名,你编写的代码就不再起作用,而且你会将两个与彼此无关的软件部分耦合在一起,其中一个发生变化会导致另一个停止工作。这就是所谓的耦合,在软件中耦合通常是一个坏主意。 - Petruza
1
@Petruza:在我使用Access/Jet的早期,我的模式包括一个永久性的辅助表,专门用于此目的,名为“RowRowTable”。 - onedaywhen
1
这个问题已经11年了,我甚至都不记得为什么要问它,但是stackoverflow会一直向我发送通知,直到永远。 - Petruza
1
是的,有这个功能,我只是不想收到来自古老帖子的通知,也不想取消关联。关闭单个帖子的通知应该不难吧?大多数网站都有这个功能。 - Petruza
1
@Zoe已经做过了,其他人也做过了,这就是为什么我说SO似乎不关心解决这个问题。 - Petruza
显示剩余5条评论
10个回答

50

MySQL中有一个名为'dual'的虚拟表,你应该可以使用它。

select
    1
from
    dual
where
    false

这将始终给您一个空结果。


1
是的。dual 就是为此而生的。 - Rockallite
不幸的是,在MySQL 5.7以下版本中,此解决方案无法在IN子查询中使用。 select 1 in (SELECT 1 FROM dual WHERE FALSE); 返回1。唯一有效的解决方案是由@dhruvbird提出的。 - ENargit

39

这应该适用于大多数数据库,在Postgres和Netezza上进行了测试:

SELECT NULL LIMIT 0;

4
我最喜欢这个解决方案。在MySQL中也适用(v5.5)。 - noodl
1
不,这在MySQL的子查询中不起作用。会引发错误This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'(v5.5)。因此,这个答案不适合这个问题。 - Rockallite
1
LIMIT 不是标准,所以显然不能在“任何数据库”上工作。例如,尝试使用 MSSQL 或 DB2。 - Aleksandr Kravets
我认为LIMIT是相当标准的。这是一个很棒的解决方案(在它适用的情况下),并且有点显而易见,但出于某种原因我没有想到,所以感谢您的发布。 - Jake

15

T-SQL(MSSQL):

SELECT Top 0 1;

8
如何?
 SELECT * FROM (SELECT 1) AS TBL WHERE 2=3

在myphp中进行了检查,它也适用于sqlite,可能也适用于任何其他的数据库引擎。


4
SELECT NULL WHERE FALSE;

它可在PostgreSQL、MySQL中工作,在MySQL中可使用子查询。


1
在mysql 5.7中这个不起作用。请使用SELECT NULL FROM some_table WHERE FALSE代替。 - Georg Schölly
OP明确表示这个查询对他们没有起作用。 - Martijn Pieters

4
这可能适用于所有数据库。
SELECT * FROM (SELECT NULL AS col0) AS inner0 WHERE col0 IS NOT NULL;

3
SELECT TOP 0 * FROM [dbo].[TableName]

这是一种合理的常量扫描运算符方法。

OP要求查询时不需要指定现有的表名,而你的回答需要。 - Marki555

2
这个怎么样?
SELECT 'MyName' AS EmptyColumn
FROM dual
WHERE 'Me' = 'Funny'

我尝试过类似这样的东西,但我猜在MySQL中使用Where而不使用From至少是不合法的,不知道ANSI SQL。 - Petruza

1
SELECT * FROM (SELECT NULL) WHERE 0

3
提供解决问题的代码时,最好也至少提供一个简短的说明,以便阅读的人不必逐行解析代码来理解其中的差异。注意不要改变原意。 - Fluffeh
6
在我的 MySQL 版本上,我需要添加别名: SELECT * FROM (SELECT NULL) a WHERE 0; (说明:这是一条 SQL 查询语句,意思是从一个临时表中选择所有列,但该表没有任何行符合 WHERE 子句的条件。添加别名是为了让查询语句合法。) - shark555

0
在PostgreSQL中,一个简单的
SELECT;

可行。您甚至不会得到任何标记为“未知”的列。
但请注意,它仍然显示检索到1行。


那么从技术上讲,它不是一个空结果集,对吧?select where false 怎么样? - Aleksandr Kravets
不是返回0行,而是返回0列。 - luckydonald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接