【開發篇sql】 條件和表示式(二) 資料型別的比較規則
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【開發篇sql】 條件和表示式(一) 資料型別SQL資料型別
- 【開發篇sql】 條件和表示式(八) 10g 正規表示式SQL
- 【開發篇sql】 條件和表示式(十) 特定的dmlSQL
- 【開發篇sql】 條件和表示式(九) group by語句SQL
- 【開發篇sql】 條件和表示式(六) Exists, not exsists,in ,not inSQL
- 【開發篇sql】 條件和表示式(五) 集合運算SQL
- 【開發篇sql】 條件和表示式(三) Null詳解SQLNull
- 二、資料型別和表示式資料型別
- 【開發篇sql】 條件和表示式(四) 幾個常見的偽列SQL
- 三、資料型別和表示式二資料型別
- 【開發篇sql】 條件和表示式(七) decode,case when,connect by 語句SQL
- ORACLE DATE和TIMESTAMP資料型別的比較(二) (轉)Oracle資料型別
- 資料型別和表示式題目資料型別
- 【開發篇plsql】plsql資料型別(二) recordSQL資料型別
- XML Schema和XML DTD的資料型別比較XML資料型別
- 通用函式和條件表示式函式
- MySql和SQL Server資料型別 對比MySqlServer資料型別
- 資料庫SQL開發命名規則 (轉)資料庫SQL
- WHRER條件裡的資料型別必須和欄位資料型別一致資料型別
- ORACLE DATE和TIMESTAMP資料型別的比較(一) (轉)Oracle資料型別
- Julia不同資料型別函式的內部程式碼比較資料型別函式
- Oracle date 型別比較和String比較Oracle型別
- Oracle三種集合資料型別的比較Oracle資料型別
- PHP基礎-資料型別-string和int比較PHP資料型別
- 開發60條規則
- JS資料型別轉換規則JS資料型別
- 【開發篇plsql】plsql資料型別(一) 集合型別SQL資料型別
- SQL稽核 | SQLE 如何開發一條自定義的規則SQL
- C++ 中三種正規表示式比較C++
- 條件型別型別
- 比較SQL資料庫和HadoopSQL資料庫Hadoop
- Oracle vs PostgreSQL,研發注意事項(8)- Oracle資料比較規則OracleSQL
- SSIS 資料型別 第二篇:變數的資料型別資料型別變數
- Oracle的 資料型別比較及注意事項Oracle資料型別
- 一些比較常用的 js 正規表示式 javaJSJava
- Oracle OCP(06):通用函式和條件表示式Oracle函式
- 實驗1 C語言開發環境使用和資料型別,運算子,表示式C語言開發環境資料型別
- 實驗一 c語言開發環境使用和資料型別、運算子、表示式C語言開發環境資料型別