使用不含萬用字元的like運算子遇到char型別的欄位時要注意!

warehouse發表於2008-04-19
在CBO下,oracle會把不含萬用字元的like表示式轉為為等式,前提是like前面的欄位型別必須是可變寬度字元型別的。當遇到char型別的欄位時它不會這樣做![@more@]

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章