【開發篇sql】 條件和表示式(二) 資料型別的比較規則

yellowlee發表於2010-05-15

2,資料型別的比較規則

 

主要看幾個常見且比較重要的例子。

Char字元的比較,是比較ascii值的大小:

SQL> select 1 from dual where 'ab' >'ac';

 

         1

----------

 

SQL> select 1 from dual where 'ab'

 

         1

----------

         1

SQL> select 1 from dual where 'a'

 

         1

----------

         1

字元與數值的比較,有一個隱身轉換的過程:

SQL> select 1 from dual where '32' = 32;

 

         1

----------

         1

但是下面這樣的情況並不會將32隱身轉換為’32’

SQL> select 1 from dual where 'a' = 32;

 

select 1 from dual where 'a' = 32

 

ORA-01722: invalid number

 

之所以這裡特意提到隱式轉換,是因為,往往在sql條件中,由於隱式轉換可能會禁用相關的索引,這個也是sql效能的一大隱患,可以簡單看一個例子,注意不能使用上面建立的表,drop後新建,插入下列資料:

Insert into t_test_chr values ('1111', '1111', '1111');

 

SQL> create index t_test_chr_id2 on t_test_chr(type_varchar2);

 

Index created

 

SQL> select * from t_test_chr a where a.type_varchar2='aaaa';

Execution Plan

----------------------------------------------------------

Plan hash value: 3150866331

 

----------------------------------------------------------------------------------------------

| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |                |     1 |    40 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| T_TEST_CHR     |     1 |    40 |     2   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | T_TEST_CHR_ID2 |     1 |       |     1   (0)| 00:00:01 |

----------------------------------------------------------------------------------------------

 

SQL>  select * from t_test_chr a where a.type_varchar2=1;    

 

no rows selected

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 217284118

 

--------------------------------------------------------------------------------

| Id  | Operation         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |            |     1 |    40 |     3   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| T_TEST_CHR |     1 |    40 |     3   (0)| 00:00:01 |

--------------------------------------------------------------------------------

可以看到由於隱式轉換使得查詢走了不同的執行路徑,在很多時候這種變化不是開發者所期待的,所以需要留意資料型別。具體可以參加《sql reference》的Datatype Comparison Rules一節。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-662797/,如需轉載,請註明出處,否則將追究法律責任。

相關文章