Oracle SQL - 将选择计数(*)转换为零或一

Posted

技术标签:

【中文标题】Oracle SQL - 将选择计数(*)转换为零或一【英文标题】:Oracle SQL - convert select count(*) into zero or one 【发布时间】:2015-10-23 19:35:35 【问题描述】:

我正在使用 Oracle,我想将选择计数的结果转换为“二进制”0/1 值 ... 0 = 0 ...非零 = 1。根据我在网上阅读的内容,在MS SQL,您可以将其转换为“位”,但 Oracle 似乎不支持。

这是我的简单示例查询(实际查询要复杂得多)。我希望 MATCH_EXISTS 始终为 0 或 1。这可能吗?

select count(*) as MATCH_EXISTS 
from MY_TABLE 
where MY_COLUMN is not null;

【问题讨论】:

@JuanCarlosOropeza -- 这是周五所有 DBA 宣布工作周结束的神奇时刻。 【参考方案1】:

这应该是最快的……最多得到一行。

SELECT COUNT(*) AS MATCH_EXISTS
FROM MY_TABLE 
WHERE MY_COLUMN IS NOT NULL
  AND rownum <= 1;

【讨论】:

你打败了我,但为什么你需要rownum? 因为你不希望 count(*) 大于 1 并且它会很快。当它找到第一个非空时停止 (删除了之前的评论,这个效果很好,我只是测试错了。) @hvd - 最多一个非空行。有一个地方。 太棒了!这真的很光滑。我永远不会使用 rownum 作为 where 子句的约束来获得我想要的结果。【参考方案2】:

如果您使用exists 子句,这对于大型表应该更快,因为Oracle 不需要扫描整个表。只要有一行,它就可以停止检索它:

select count(*) as match_exists
from dual
where exists (select * 
              from my_table 
              where my_column is not null);

【讨论】:

rownum 像我的例子会更快——只有一个选择而不是两个。 @Hogan:这也会从my_table 中仅选择 一个 行。 dual 上的“计数”本质上是“免费的” 但不是完全免费的:) @Hogan:我认为你无法衡量这一点。 嘿,如果它使执行计划更长,那么它很重要!【参考方案3】:

不要使用count()。为了性能,请使用exists

select (case when exists (select 1 as MATCH_EXISTS 
                          from MY_TABLE 
                          where MY_COLUMN is not null
                         )
              then 1 else 0
        end)
from dual;

这可以明显更快。

【讨论】:

你不认为我的在 result = 1 的情况下会更快吗? @Hogan 看起来 exists 将完全适用于您的 rownum &lt;=1 @Hogan。 . .不,我不认为你的会更快。他们可能都有相同的计划。但是,对于复杂的查询,我相信优化器会始终如一地为EXISTS 选择最佳计划而不是rownum EXISTS 也更便携。所以总的来说,你的答案可能会更好。我很震惊——这是我的答案第一次被选中而不是你和马。我现在可能要退休了。成就解锁。 @Hogan。 . .你很聪明。【参考方案4】:

你可以使用CASE WHEN:

SELECT CASE WHEN MATCH_EXISTS = 0 THEN 0
            ELSE 1
       END AS MATCH_EXISTS 
FROM (SELECT COUNT(*) AS MATCH_EXISTS 
      FROM MY_TABLE 
      WHERE MY_COLUMN IS NOT NULL) AS t;

编辑:

SELECT CASE WHEN COUNT(*) = 0 THEN 0
            ELSE 1
        END as MATCH_EXISTS 
FROM MY_TABLE 
WHERE MY_COLUMN IS NOT NULL;

【讨论】:

以上是关于Oracle SQL - 将选择计数(*)转换为零或一的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中将小数转换成字符丢零.截取小数.除数为零解决法

当列中的行为空时,ORACLE显示计数为零

Oracle SQL - 如何使用 PIVOT 进行计数

如何禁止oracle采用科学计数法

如何从oracle sql中的选择计数中对rownum使用case语句?

Oracle SQL Developer - 计数函数