來源:https://blog.guoqianfan.com/2019/01/27/how-to-use-like-and-patindex-in-sqlserver/
在SQL Server中,能使用通配符的只有2個:LIKE、PATINDEX。
不過LIKE支持2種通配符轉義,無限制最全面;而PATINDEX只支持最簡單的通配符轉義([]
轉義),限制較多。
LIKE
LIKE 是邏輯運算符,能使用通配符,並且支持2種方法來轉義通配符。
語法
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
[ XX ]
代表是可選的,所以可以沒有轉義表達式ESCAPE escape_character
。
參數
-
match_expression
任何有效的字符數據類型的表達式。
-
pattern
要在 match_expression 中搜索並且可以包括下列有效通配符的特定字符串。 pattern 的最大長度可達 8,000 字節。
-
%
:包含零個或多個字符的任意字符串。 -
_
(下划線):任何單個字符。 -
[ ]
:指定范圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字符。數字同樣支持范圍或集合([0-9]或[0123456789])。在范圍搜索中,范圍包含的字符可能因排序規則的排序規則而異。
-
[^]
:不屬於指定范圍 ([a-f]) 或集合 ([abcdef]) 的任何單個字符。數字同樣支持。
-
-
escape_character
放在通配符之前用於指示通配符應當解釋為常規字符而不是通配符的字符。 escape_character 是字符表達式,無默認值,並且計算結果必須僅為一個字符。
結果類型
Boolean
結果值
如果 match_expression 與指定的 pattern 相匹配,則 LIKE 返回 TRUE。
備注
何時忽略尾隨空格
- pattern里有空格時必須匹配!
- pattern里無空格時會忽略match_expression的零個或多個尾隨空格。
- 此時應該注意
char
、nchar
類型,因為不足長度時會自動添加尾隨空格,有可能出現問題。
測試sql如下:
--pattern里有空格時必須匹配
select 1 where '123' like '123 ';
--無
--pattern里無空格時會忽略match_expression的【尾隨】空格
select 1 where '123 ' like '123';
--1
--pattern里無空格時【不會】忽略match_expression的【前置】空格
select 1 where ' 123' like '123';
--無
否定的幾種形式
相等
'xx' NOT LIKE 'yy'
= NOT 'xx' LIKE 'yy'
不相等
NOT LIKE 'dm%'
!= LIKE '[^d][^m]%'
-
NOT LIKE 'dm%'
:結果可以是:da、tm... -
LIKE '[^d][^m]%'
:會排除掉所有以 d 開始或第二個字母為 m 的名稱。這是因為用反向通配符匹配字符串是分步驟進行計算的,一次一個通配符。如果在計算過程中任一環節匹配失敗,那么就會將其消除。
通配符的轉義
通配符當做普通字符來使用,有2種方式。
使用[]
[]
這種方式只適合簡單的情況,有很多限制,不推薦。
能轉義的字符有:百分號 (%)、下划線 (_) 和左括號 ([) ,其他的轉義不了,或者只能特殊情況下使用(例如短橫線-
只有在首位時才被視為普通字符)。如果強行使用[]
來轉義會導致結果錯誤!!推薦使用ESCAPE
子句來進行轉義。
使用ESCAPE
子句
ESCAPE
子句本來就是為轉義而生,推薦使用。
ESCAPE
子句的轉義字符是自定義的,定義為某字符,pattern里就使用這個轉義字符來轉義即可。
相關sql如下:
--轉義【%】
select 1 where '%123' like '\%123' ESCAPE '\'
--1
--轉義【_】
select 1 where '123_' like '123\_' ESCAPE '\'
--1
--轉義【[^]】
select 1 where '123[^]' like '123\[\^\]' ESCAPE '\'
--1
--自定義其他轉義字符:%
select 1 where '123[^]%_' like '123%[%^%]%%%_' ESCAPE '%'
--1
PATINDEX
PATINDEX 屬於字符串函數,支持通配符,轉義通配符只能使用[]
,所以限制頗多。
PATINDEX 返回模式在指定表達式中第一次出現的起始位置(從1開始);如果在所有有效的文本和字符數據類型中都找不到該模式,則返回零。
語法
PATINDEX ( '%pattern%' , expression )
參數
-
pattern
包含要查找的序列的字符表達式(和
LIKE
的pattern參數一樣)。可以使用通配符;但 pattern 之前和之后必須有 % 字符(搜索第一個或最后一個字符時除外)。 pattern 是字符串數據類型類別的表達式。 pattern 最多包含 8000 個字符。 -
expression
是一個表達式,通常是針對指定模式搜索的列。 expression 屬於字符串數據類型類別。
返回類型
如果 expression 的數據類型為 varchar(max) 或 nvarchar(max),則返回 bigint;否則返回 int。
結果值
返回模式在指定表達式中第一次出現的起始位置(從1開始);如果在所有有效的文本和字符數據類型中都找不到該模式,則返回零。
備注
-
如果 pattern 或 expression 為 NULL,則 PATINDEX 返回 NULL。
-
PATINDEX雖然支持通配符,但是轉義通配符只能使用
[]
!所以限制頗多。 -
在 PATINDEX 中可以使用
COLLATE
函數顯式指定要搜索的表達式的排序規則。示例sql如下:USE tempdb; GO SELECT PATINDEX ( '%ein%', 'Das ist ein Test' COLLATE Latin1_General_BIN) ; GO