使用不含萬用字元的like運算子遇到char型別的欄位時要注意!
doc描述:
The optimizer simplifies conditions that use the LIKE
comparison operator to compare an expression with no wildcard characters into an equivalent condition that uses an equality operator instead.
In the following example, the optimizer simplifies the first condition into the second:
last_name LIKE 'SMITH'
is transformed into
last_name = 'SMITH'
The optimizer can simplify these expressions only when the comparison involves variable-length datatypes. For example, if last_name
was of type CHAR
(10), then the optimizer cannot transform the LIKE
operation into an equality operation due to the equality operator following blank-padded semantics and LIKE
not following blank-padded semantics.
--===================================
SQL> desc tt
名稱 是否為空? 型別
----------------------------------------- -------- ---------------------------
ID NUMBER(38)
NAME CHAR(2)
SQL> select * from tt;
ID NA
---------- --
1 m
2 m
3 m
4 m
5 m
6 n
1000 b
b
已選擇8行。
SQL> select name,length(name) from tt;
NA LENGTH(NAME)
-- ------------
m 2
m 2
m 2
m 2
m 2
n 2
b 2
b 2
已選擇8行。
SQL> select * from tt where name = 'n';
ID NA
---------- --
6 n
上面使用=之所以能查詢出資料是因為n的後面填補了一個空格!之所以要填補是因為要查詢的字元常量n的長度1小於name的資料型別char(2)的寬度2,所以在n的後面自動填補了一個空格。
SQL> select * from tt where name = 'n ';
ID NA
---------- --
6 n
上面的查詢就沒有自動填補空格,是因為要查詢的字元常量是'n '後面已經有了空格,它的長度2等於name的型別char(2)的寬度。
SQL> select * from tt where name like 'n';
未選定行
上面的查詢之所以沒有查出資料,是因為oracle不會在like 後面的char型別的字串常量中填補空格。
SQL> alter table tt modify name varchar2(2);
表已更改。
SQL> update tt set name=substr(name,1,1);
已更新8行。
SQL> commit;
提交完成。
SQL> select name,length(name) from tt;
NA LENGTH(NAME)
-- ------------
m 1
m 1
m 1
m 1
m 1
n 1
b 1
b 1
已選擇8行。
SQL> select * from tt where name = 'n';
ID NA
---------- --
6 n
SQL> select * from tt where name like 'n';
ID NA
---------- --
6 n
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/19602/viewspace-1002747/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- php型別運算子的使用PHP型別
- SQL Like萬用字元使用SQL字元
- php運算子運用之型別運算子該如何使用PHP型別
- SQL "like" 運算子的問題SQL
- MySQL字元資料型別char與varchar的區別MySql字元資料型別
- 帶萬用字元的LIKE子句字元
- oracle的欄位型別Oracle型別
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 避免使用Oracle的char型別Oracle型別
- impdp遇到char字元含中文的問題字元
- 修改表的欄位型別型別
- PostgreSQL:時間——型別、運算子和函式SQL型別函式
- MySQL like查詢字元轉義遇到的坑MySql字元
- JSON欄位型別在ORM中的使用JSON型別ORM
- 應用中避免使用char/nchar型別型別
- 型別轉換運算子型別
- java位運算子的應用範圍Java
- oracle的long型別欄位的應用-- 實戰篇Oracle型別
- oracle的long型別欄位的應用-- 知識篇Oracle型別
- DB2的字元型欄位,NULL與空串DB2字元Null
- MongoDB中的欄位型別IdMongoDB型別
- oracle 修改欄位型別的方法Oracle型別
- 位運算子及其應用
- 欄位管理,為什麼只有新增的時候才自動匹配欄位型別型別
- 欄位字元型別不匹配導致CPU佔用率高字元型別
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- Java中的資料型別和運算子Java資料型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- MySQL的四種運算子(算術運算子、比較運算子、邏輯運算子和位運算子)MySql
- Javascript需要注意的幾個運算子JavaScript
- SQL字元型欄位按數字型欄位排序實現方法SQL字元排序
- 資料型別和運算子資料型別
- 按位運算子在java中的應用?Java
- 位運算子的計算
- 修改欄位資料型別的方法資料型別
- Like Sunday, Like Rain - JavaScript運算子優先順序AIJavaScript
- jackson 中JsonFormat date型別欄位的使用JSONORM型別
- 位運算子