2011-05-19 17 views
0

這是我在工作中遇到的問題,我把它簡化爲: 首先,測試用例在oracle中的「或」條件疑問?

create table A_TESTB 
(
    A VARCHAR2(10), 
    B VARCHAR2(10) 
); 

insert into A_TESTB (A, B) 
values ('1', '2'); 
insert into A_TESTB (A, B) 
values ('1', '3'); 
insert into A_TESTB (A, B) 
values ('1', '4'); 
commit; 

SQL> select * from a_testb; 

A   B 
---------- ---------- 
1   2 
1   3 
1   4 

然後,我用SQL像下面

SQL> SELECT * 
    2 FROM (SELECT '10' TESTTYPE, T.* FROM A_TESTB T) W 
    3 WHERE (W.A = '1' OR 1 = 2) 
    4  AND W.TESTTYPE = '999999'; 

TESTTYPE A   B 
-------- ---------- ---------- 
10  1   2 
10  1   3 
10  1   4 

的問題是:我有使用條件AND W.TESTTYPE = '999999'進行過濾,我的期望結果集應該是空的,但似乎條件不起作用,祕密可能從OR,但爲什麼它不工作?

+1

如果你的和'WB ='99999''怎麼辦?我懷疑這個常量沒有得到正確的處理,而不是OR導致的問題,但是我沒有可用的oracle來做任何測試。 – 2011-05-19 15:36:58

+1

如果我和是「W.B ='99999'」結果集爲空,但我需要 「W.TESTTYPE」而不是「W.B」 – stephen 2011-05-19 16:28:53

+1

您可以發佈查詢的執行計劃,包括謂詞過濾器嗎? – 2011-05-19 17:25:14

回答

4

我的結果集是空的!

我使用

Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod 
PL/SQL Release 10.2.0.3.0 - Production 
CORE 10.2.0.3.0 Production 
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production 
NLSRTL Version 10.2.0.3.0 - Production 

沒有行返回查詢使用蟾蜍版本10.5.0.41:

SELECT * 
    FROM (SELECT '10' TESTTYPE, T.* 
      FROM A_TESTB T) W 
WHERE (W.A = '1' OR 1 = 2) AND W.TESTTYPE = '999999'; 

我運行它也在SQL * Plus,只是要100%地肯定:

SQL> SELECT * 
    2 FROM (SELECT '10' TESTTYPE, T.* FROM A_TESTB T) W 
    3 WHERE (W.A = '1' OR 1 = 2) 
    4  AND W.TESTTYPE = '999999'; 

No rows selected. 

SQL> 
+1

我在SQL Server中運行了一個測試,並且沒有收到任何返回的行。 – rosscj2533 2011-05-19 15:48:59

+1

按預期工作對我也是如此; SQL Developer到Oracle 10.2.0.5下的Solaris。 – 2011-05-19 16:20:59

+1

我的會話是 SQL> SELECT * FROM v $ version; BANNER ---------------------------------------------- ------------------ 個人Oracle9i版本9.2.0.1.0 - 生產 PL/SQL版本9.2.0.1.0 - 生產 核心\t 9.2.0.1.0 \t生產 適用於32位Windows的TNS:版本9.2.0.1.0 - 生產 NLSRTL版本9.2.0.1.0 - 生產 我可以在我的環境中100%獲得3行,所以問題在哪裏? – stephen 2011-05-19 16:34:59