【问题标题】:How to select an empty result set?如何选择一个空的结果集?
【发布时间】:2009-09-21 18:40:18
【问题描述】:

我在 MySQL 中使用存储过程,带有 CASE 语句。

在 CASE 的 ELSE 子句中(相当于 default: )我想选择并返回一个空的结果集,从而避免不处理 ELSE 的情况而引发 SQL 错误,而是像返回一个空的结果集一样常规查询不会返回任何行。

到目前为止,我已经设法通过以下方式做到这一点:
Select NULL From users Where False

但我必须命名一个现有的表,例如本例中的“用户”。 它可以工作,但如果最终重命名或删除使用的表名,我更喜欢一种不会中断的方式。

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

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

【问题讨论】:

  • 你是对的。存在很多表,问题是一旦你选择了一个表,如果将来删除或重命名该表,你编写的代码将不再工作,你将耦合两个没有任何东西的软件与彼此有关,但其中一个的变化使另一个停止工作。这就是所谓的耦合,而软件中的耦合通常是个坏主意。
  • @Petruza:在我使用 Access/Jet 的时候,我的架构会为此目的包含一个名为“RowRowTable”的永久辅助表。
  • 请不要回答或评论。这个问题已有 11 年的历史了,我什至不记得我为什么问它,但 stackoverflow 会继续向我发送通知,直到时间结束。
  • @zoe 所以你确实看到了 Stackoverflow 拒绝解决的问题,对吧?
  • 是的,我只是不想收到来自旧帖子的通知,不想解除关联。关闭单个帖子的通知有多难?大多数网站都有它。

标签: sql mysql stored-procedures null resultset


【解决方案1】:

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

select
    1
from
    dual
where
    false

这总是会给你一个空的结果。

【讨论】:

  • 是的。 dual就是为此而生的。
  • 不幸的是,这个解决方案在 MySQL 5.7 下的 IN 子查询中不起作用。 select 1 in (SELECT 1 FROM dual WHERE FALSE); 返回 1。只有 @dhruvbird 提出的解决方案对我有用
【解决方案2】:

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

SELECT NULL LIMIT 0;

【讨论】:

  • 我最喜欢这个解决方案。也适用于 MySQL (v5.5)。
  • 不,这在 MySQL 的子查询中不起作用。引发错误This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' (v5.5)。所以这个答案不适合这个问题。
  • LIMIT 不是标准的,所以显然它不能在“任何数据库”上工作。例如尝试 MSSQL 或 DB2。
  • 我认为LIMIT 是相当标准的。这是一个简洁的解决方案(它的工作原理),而且有点明显,但由于某种原因我没有想到它,所以感谢发布。
【解决方案3】:

T-SQL (MSSQL):

SELECT Top 0 1;

【讨论】:

    【解决方案4】:

    怎么样

     SELECT * FROM (SELECT 1) AS TBL WHERE 2=3
    

    在 myphp 中检查,它也可以在 sqlite 中运行,并且可能在任何其他数据库引擎中。

    【讨论】:

      【解决方案5】:

      这可能适用于所有数据库。

      SELECT * FROM (SELECT NULL AS col0) AS inner0 WHERE col0 IS NOT NULL;
      

      【讨论】:

        【解决方案6】:
        SELECT TOP 0 * FROM [dbo].[TableName]
        

        这是恒定扫描算子的合理做法。

        【讨论】:

        • OP 要求进行查询,而无需指定您的答案需要的现有表名。
        【解决方案7】:
        SELECT NULL WHERE FALSE;
        

        它适用于postgresql,mysql,mysql中的子查询。

        【讨论】:

        • 这在 mysql 5.7 中不起作用。请改用SELECT NULL FROM some_table WHERE FALSE
        • OP 明确指出此查询不适用于他们。
        【解决方案8】:

        这个怎么样?

        SELECT 'MyName' AS EmptyColumn
        FROM dual
        WHERE 'Me' = 'Funny'
        

        【讨论】:

        • 我已经尝试过这样的事情,但我想使用 Where without From 至少在 MySQL 中是不合法的,不知道 ANSI SQL。
        【解决方案9】:
        SELECT * FROM (SELECT NULL) WHERE 0
        

        【讨论】:

        • 在提供解决问题的代码时,最好也至少简短地解释一下它是如何工作的,这样阅读的人就不必逐行精神分析来理解差异.
        • 在我的 mysql 版本上,我必须添加别名:SELECT * FROM (SELECT NULL) a WHERE 0;
        【解决方案10】:

        在 PostgreSQL 中一个简单的

        SELECT;
        

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

        【讨论】:

        • 所以从技术上讲,它不是一个空的结果集,是吗? select where false 怎么样?
        • 返回 0 列而不是 0 行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多