通常,要检查 Oracle 中的存在,我会这样做:
SELECT COUNT(1)
FROM foo
WHERE bar = 'baz'
但是,如果foo
表包含多行 where bar='baz'
,则此查询不必要地扫描整个表以报告总计数。
如何快速检查表中的列是否包含至少一个具有指定值的行,并使查询短路,以便一旦检测到该值存在,查询将停止并返回,而不是扫描整个表?
理想情况下,无论表中有多少行包含该值,我都希望此查询返回一个标量值。
以下解决方案似乎是短路的(与 相比SELECT COUNT(1)
,这对于大表来说要快得多),但是如果值存在,它将返回 1,或者如果值不存在,则根本不返回任何行。如果总是返回一行会更好。
SELECT 1
FROM DUAL
WHERE EXISTS (
SELECT 1
FROM foo
WHERE bar = 'baz'
)
只需将两者结合起来:
除了 Balazs 对您的查询的自然改进之外,以下内容应该有效