如何在Oracle中使用Select Exists?

9
以下是在Oracle中与下面的SQL查询等价的查询语句:
SELECT CAST(
   CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') THEN 1 
   ELSE 0 
   END 
AS BIT)

我只需要一个使用 exists 关键字的 Oracle 查询,该查询会返回像上面一样的 0 或 1。


有什么具体要求吗?如果您能分享表结构和所需输出类型,那就太好了。一些样本输出将不胜感激。 - abhi
不用担心表结构,我只需要一个使用exists的Oracle查询,并返回0或1。 - The Light
你是否必须同时使用两个?只需要一个也可以满足要求。如果您能分享需求或想要查看数据的形式,那将更有意义。 - abhi
5个回答

14

等价于:

select count(*) 
from dual 
where exists (SELECT * FROM theTable where theColumn like 'theValue%')

3
我被告知要使用count(1)和exists(select 1...)来提高性能,但我从未检查过是否有任何实际的改善。虽然听起来很合理。 - Trajan
如果您使用一个不存在的表格,这将会产生一个错误,而不是返回0。 - vapcguy
@vapcguy 表的存在是另一种问题。 - Florin Ghita
(*)和(1)之间没有区别。 - Scott
这个不等同于 OP 所期望的结果,因为 OP 正在寻找一个结果,无论它是否存在。1 或 0。我相信 ypercube 的答案是正确的,我现在将尝试它。 - Skystrider

13

这将显示相同的输出。 只需删除CAST并添加FROM dual,因为Oracle不允许带有SELECT但没有FROM的查询:

SELECT 
   CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') 
     THEN 1 
     ELSE 0 
   END 
FROM dual ;

SQL-Fiddle上进行了测试


6
您可以这样书写它:
SELECT COUNT(*) FROM theTable WHERE theColumn LIKE 'theValue%' AND ROWNUM = 1

这将返回0-1,优化器会理解查询是为了首行访问而进行优化。

我猜,在“if”条件中这样写是行不通的。比如:if(SELECT COUNT(*) FROM theTable WHERE theColumn LIKE 'theValue%' AND ROWNUM = 1)>0 - TechDo
2
@techdo:在PLSQL中,这是行不通的,因为你不能在PL中使用IFSELECT。然而,在任何允许使用SELECT的地方都可以工作,特别是在SELECT子句或CASE语句内部(CASE WHEN (SELECT count(*) ...) > 0 THEN ... ELSE ... END)。 - Vincent Malgrat
好的...是的。谢谢你...只是想确认一下。 - TechDo
1
@VincentMalgrat:你可以PL/SQL中使用IF,但不能在(Oracle的)SQL中使用。在Oracle中,PL/SQL仅适用于存储过程。其他所有内容都是“只是”SQL。 - user330315

2

您还可以在CASE语句中使用MAX函数:

SELECT MAX(
   CASE 
     WHEN theColumn like 'theValue%' THEN 1 
   ELSE 
     0 
   END)  
AS BIT
FROM theTable

-1

您可以使用以下查询之一:(第一个查询更高效)

SELECT H.TABLE_ID, H.OTHER_FIELD, 
(SELECT 'YES' FROM DUAL WHERE EXISTS (SELECT  'X' FROM TABLE_DETAIL DT
WHERE DT.TABLE_ID = H.TABLE_ID) ) WITH_DETAIL FROM TABLE_HEADER H; 

SELECT H.TABLE_ID, H.OTHER_FIELD, 
CASE WHEN EXISTS(SELECT * FROM IMTS.DETAIL_TABLE DT WHERE DT.TABLE_ID=H.TABLE_ID)  
THEN 'Y' ELSE 'N' END WITH_DETAIL FROM HEADER_TABLE H; 

SELECT H.TABLE_ID, H.OTHER_FIELD, NVL2(DT.SOME_NOTNULL_FIELD, 'YES','NO') WITH_DETAIL
FROM TABLE_HEADER H
LEFT JOIN TABLE_DETAIL DT ON DT.TABLE_ID=H.TABLE_ID AND ROWNUM<2; 

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