談談方括號萬用字元

空軍發表於2013-05-25

《SQL必知必會(第4版)》第6課 用萬用字元進行過濾

6.1.3 方括號([])萬用字元

方括號([])萬用字元用來指定一個字符集,它必須匹配指定位置(萬用字元的位置)的一個字元。

……

此萬用字元可以用字首字元^(脫字號)來否定。例如,下面的查詢匹配不以 J 或 M 起頭的任意聯絡人名:

SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[^JM]%'
ORDER BY cust_contact;

當然,也可以使用 NOT 操作符得出相同的結果。^ 的唯一優點是在使用多個 WHERE 子句時可以簡化語法:

SELECT cust_contact
FROM Customers
WHERE NOT cust_contact LIKE '[JM]%'
ORDER BY cust_contact;

該小節第一句話“它必須匹配指定位置的一個字元”非常正確。

然後作者說:'[^JM]%' 匹配不以 JM 起頭的任意聯絡人,這就不對了。正確的說法應該是:'[^JM]%' 匹配以 JM 之外的任意字元起頭的聯絡人。因為 '[^JM]%' 要求至少有一個字元,它無法匹配空字串 '' ,而“不以 JM 起頭的任意聯絡人名”理論上可以包括空字串的情形。

作者接著說:當然,也可以使用 NOT 操作符得出相同的結果。這也不對。結果並不嚴格相同:LIKE '[^JM]%' 不能匹配空字串,NOT LIKE '[JM]%' 能。

正規表示式

正規表示式也有同樣的方括號語法(我猜 M$ SQL 的方括號萬用字元語法就是從與正規表示式學來的)。注意:無論是否有脫字號 ^[...] 必須匹配且只能匹配一個字元,不能是零個,也不能多於一個。[^...] 中的 ^ 是否定脫字號之後的 ... ,而不是否定整個方括號 [...] 。正規表示式的初學者經常在這個地方犯錯誤,應引以為戒。

相關文章