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 <=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中将小数转换成字符丢零.截取小数.除数为零解决法