8

什么是下面的等价SQL QueryOracle

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

我只想要一个使用 exists 的 oracle 查询,它像上面一样返回 0 或 1。

4

5 回答 5

14

相当于:

select count(*) 
from dual 
where exists (SELECT * FROM theTable where theColumn like 'theValue%')
于 2013-05-15T10:39:44.253 回答
8

这将显示相​​同的输出。刚刚删除CAST并添加了 a 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测试

于 2013-05-15T12:11:36.420 回答
6

你可以这样写:

SELECT COUNT(*) FROM theTable WHERE theColumn LIKE 'theValue%' AND ROWNUM = 1

这将返回0-1并且优化器得到查询将针对第一行访问进行优化。

于 2013-05-15T10:10:01.240 回答
2

您还可以将 MAX 与 CASE 一起使用:

SELECT MAX(
   CASE 
     WHEN theColumn like 'theValue%' THEN 1 
   ELSE 
     0 
   END)  
AS BIT
FROM theTable
于 2013-05-15T12:06:51.213 回答
0

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

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; 
于 2016-02-17T17:07:12.037 回答