當前位置:首頁 » 編程語言 » sql正則
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql正則

發布時間: 2022-01-12 22:22:21

sql 實現正則表達式

沒有正則表達式LIKE

確定給定的字元串是否與指定的模式匹配。模式可以包含常規字元和通配符字元。模式匹配過程中,常規字元必須與字元串中指定的字元完全匹配。然而,可使用字元串的任意片段匹配通配符。與使用 = 和 != 字元串比較運算符相比,使用通配符可使 LIKE 運算符更加靈活。如果任何參數都不屬於字元串數據類型,Microsoft® SQL Server™ 會將其轉換成字元串數據類型(如果可能)。

語法
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

參數
match_expression 任何字元串數據類型的有效 SQL Server 表達式。
patternmatch_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符

1 % 包含零個或更多字元的任意字元串
示例:WHERE title LIKE '%computer% ' 將查找處於書名任意位置的包含單詞 computer 的所有書名。

2 _(下劃線) 任何單個字元
示例:WHERE au_fname LIKE '_ean ' 將查找以 ean 結尾的所有 4 個字母的名字(Dean、Sean 等)。

3 [] 指定范圍中的任何單個字元
示例:WHERE au_lname LIKE '[C-P]arsen ' 將查找以arsen 結尾且以介於 C 與 P 之間的任何單個字元開始的 作者姓氏,例如,Carsen、Larsen、Karsen 等

4 [^] 不屬於指定范圍中的任何單個字元,與 [] 相反
示例:WHERE au_lname LIKE 'de[^l]% ' 將查找以 de 開始且其後的字母不為 l 的所有作者的姓氏。

一 使用 like 的模式匹配:
在搜索Datetime類型時,建議使用like .
LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。當所有參數,包括 match_expression、pattern 和 escape_character(如果有)都是 ASCII 字元數據類型時,將執行 ASCII 模式匹配。如果其中任何參數屬於 Unicode 數據類型,則所有參數將被轉換為 Unicode 並執行 Unicode 模式匹配。當對 Unicode 數據(nchar 或 nvarchar 數據類型)使用 LIKE 時,尾隨空格是有意義的。但是對於非 Unicode 數據,尾隨空格沒有意義。Unicode LIKE 與 SQL-92 標准兼容。ASCII LIKE 與 SQL Server 的早期版本兼容

二 使用 % 通配符

例如,此查詢將顯示資料庫中所有的系統表,因為它們都以字母 sys 開始:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'sys% '
若要查閱非系統表的所有對象,請使用 NOT LIKE 'sys% '。如果共有 32 個對象且 LIKE 找到 13 個與模式匹配的名稱,則 NOT LIKE 將找到 19 個與 LIKE 模式不匹配的對象

三 使用escape字句的模式匹配

可搜索包含一個或多個特殊通配符的字元串。例如,customers 資料庫中的 discounts 表可能存儲含百分號 (%) 的折扣值。若要搜索作為字元而不是通配符的百分號,必須提供 ESCAPE 關鍵字和轉義符。例如,一個樣本資料庫包含名為 comment 的列,該列含文本 30%。若要搜索在 comment 列中的任何位置包含字元串 30% 的任何行,請指定由 WHERE comment LIKE '%30!%% ' ESCAPE '! ' 組成的 WHERE 子句。如果不指定 ESCAPE 和轉義符,SQL Server 將返回所有含字元串 30 的行。

下例使用 ESCAPE 子句和轉義符查找 mytbl2 表的 c1 列中的精確字元串 10-15%

USE pubs
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'mytbl2 ')
DROP TABLE mytbl2
GO
USE pubs
GO
CREATE TABLE mytbl2
(
c1 sysname
)
GO
INSERT mytbl2 VALUES ( 'Discount is 10-15% off ')
INSERT mytbl2 VALUES ( 'Discount is .10-.15 off ')
GO
SELECT c1
FROM mytbl2
WHERE c1 LIKE '%10-15!% off% ' ESCAPE '! '
GO

四 使用 [] 通配符

下例查找姓為 Carson、Carsen、Karson 或 Karsen 的作者所在的行。
USE pubs
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_lname LIKE '[CK]ars[eo]n '
ORDER BY au_lname ASC, au_fname ASC

❷ sql 正則表達式匹配

  • 當我們要進行一些簡單的糊塗查詢時用百分號(%),通配符(_)就可以了.其中%表達任意長度的字元串,_表示任意的某一個字元.

比如

select*fromempwhereenamelike's%'orenamelike's_';

但如果在一些復雜的查詢中關用這兩個符號sql語句就會非常復雜,而且也不一定能實現.從Oracle 10g開始引入了在其他程序語言中普通使用的正則表達式.

主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四個正則表達式函數.

  • 正則表達式中的元字元:

元字元 意思 例子

說明要匹配的字元是一個特殊字元、常量或者後者引用。(後引用重復上一次的匹配)

匹配換行符
\ 匹配
匹配(匹配 )


^ 匹配字元串的開頭位置 ^a匹配arwen.但不匹配barwen.

$ 匹配字元串的末尾位置 en$匹配arwen.但不匹配arwenb.

* 匹配前面的字元0次或多次 a*rwen可以匹配rwen或aaarwen.

+ 匹配前面的字元1次或多次 a+rwen可以匹配arwen或aarwen.但不能匹配rwen.

? 匹配前面的字元0次或1次 a?rwen可以匹配arwen或rwen.但不能匹配aarwen.

{n} 匹配前面的字元恰好是n次,其中n是整數 ar{2}wen可以匹配arrwen.但不能匹配arwen或arrrwen.

{n,m} 匹配前面的字元至少是n次,最多是m次.如果寫成{n,} 表示最少匹配n次.沒有上限.

ar{1,2}wen可以匹配arwen,arrwen.但不匹配awen或arrrwen.


. 點號,匹配除null,換行以外的任意單個字元 arw.n.可以匹配arwen,arwin.但不能匹配arween或arwn.

(pattern) 括弧中pattern是一個子正則表達式,匹配指定pattern模式的一個子表達式。 其實括弧就像一般語言表達式中的括弧.有時多加些括弧可增強可讀性.另外的用處見下面關於 的描述.

x|y 匹配「或」 x|y可以匹配x或者y

[abc] 可以匹配abc中的任何單個字元 hello[abc]可以匹配helloa,hellob,helloc

[a-z] 可以匹配指定范圍內的任何單個字元 hell[a-z]可以匹配hello或者hellz

[::] 指定一個字元類,可以匹配該類中的任何字元 [:alphanum:]可以匹配字元0-9、A-Z、a-z
[:alpha:]可以匹配字元A-Z、a-z
[:blank:]可以匹配空格或tab鍵
[:digit:]可以匹配數字0-9
[:graph:]可以匹配非空字元
[:lower:]可以匹配小寫字母a-z
[:print:]與[:graph:]類似,不同之處在於[:print:]包括空格字元
[:punct:]可以匹配標點符號.,""等等
[:space:]可以匹配所有的空字元
[:upper:]可以匹配大寫字母A-Z
[:xdigit:]可以匹配十六進制數字0-9、A-F、a-f

這是對前一次匹配命中的一個後引用,其中n是一個正整數 arw(en)1可以匹配arwenen.注意1前面必須是個加括弧的子表達式.

  1. regexp_like:

regexp_like(x,pattern[,match_option]),查看x是否與pattern相匹配,該函數還可以提供一個可選的參數match_option字元串說明默認的匹配選項。match_option的取值如下:
『c』 說明在進行匹配時區分大小寫(預設值);
'i' 說明在進行匹配時不區分大小寫;
'n'(.)點號能表示所有單個字元,包括換行(俺還不知道什麼地方有用到換行.只知道sql裡面可以用chr(10)表示換行.
'm' 字元串存在換行的時候當作多行處理.這樣$就可匹配每行的結尾.不然的話$只匹配字元串最後的位置.

示例:select * from emp where regexp_like(ename,'^a[a-z]*n$');可以查找ename中以a開頭以n結尾的行.例如ename為arwen或arwin或anden.但Arwen不能被匹配.因為默認是區分大小寫.如果是select * from emp where regexp_like(ename,'^a[a-z]*n$','i')則可以查找ename為Arwen的行記錄.

2. regexp_instr:

REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用於在x中查找pattern。返回pattern在x中出現的位置。匹配位置從1開始。可以參考字元串函數 INSTR(),參數相關:
'start' 開始查找的位置;
'occurrence' 說明應該返回第幾次出現pattern的位置;
'return_option' 說明應該返回什麼整數。若該參數為0,則說明要返回的整數是x中的一個字元的位置;若該參數為非0的整數,則說明要返回的整數為x中出現在pattern之後 的字元的位置;
'match_option' 修改默認的匹配設置.與regexp_like裡面的相同.

示例:

DECLARE

V_RESULTINTEGER;

BEGIN

SELECT REGEXP_INSTR('hello world','o',1,1,0)INTO V_RESULT

FROM DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END;

結果為5.即字母o第一個次出現的位置

如果regexp_instr('hello world','o',1,1,n)其中n為除0之外的整數.比如1,3.則結果為6.表示第一次出現字母o的後面一個字元的位置.

如果regexp_instr('hello world','o',1,2,0)則結果為9.表示第二次出現字母o的位置.

3. regexp_replace:

REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用於在x中查找pattern,並將其替換為replae_string。可以參考字元串函數 REPLACE(),參數同REGEXP_INSTR函數

示例:

DECLARE

V_RESULT varchar2(90);

BEGIN

SELECT REGEXP_REPLACE('hello world','o','x',1,1)INTO V_RESULT

  1. FROM DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END;

結果為hellx world.

如果REGEXP_REPLACE('hello world','o','x'),則結果為hellx wxrld.

如果 REGEXP_REPLACE('hello w


orld','o','x',1,2)則結果為hello wxrld.

4.regexp_substr:

REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]])用於在x中查找pattern並返回。可以參考字元串函數 SUBSTR(),參數同REGEXP_INSTR函數.

例如:

DECLARE

V_RESULT VARCHAR2(255);

BEGIN

SELECTREGEXP_SUBSTR('hello world','l{2}')INTO V_RESULT

FROM DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END;

結果為ll

查詢到匹配的字元串才返回匹配的字元.沒查到就返回空.

❸ 如何在sql語句中使用正則表達式

sqlserver中,主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四個正則表達式函數。

1、regexp_like:

regexp_like(x,pattern[,match_option]),查看x是否與pattern相匹配,該函數還可以提供一個可選的參數match_option字元串說明默認的匹配選項。match_option的取值如下:

'c' 說明在進行匹配時區分大小寫(預設值);

'i' 說明在進行匹配時不區分大小寫;

'n' (.)點號能表示所有單個字元,包括換行(俺還不知道什麼地方有用到換行.只知道sql裡面可以用chr(10)表示換行、

'm' 字元串存在換行的時候當作多行處理.這樣$就可匹配每行的結尾.不然的話$只匹配字元串最後的位置、

示例:

select * from emp where regexp_like(ename,'^a[a-z]*n$');

可以查找ename中以a開頭以n結尾的行.例如ename為arwen或arwin或anden.但Arwen不能被匹配.因為默認是區分大小寫.如果是

select * from emp where regexp_like(ename,'^a[a-z]*n$','i')

則可以查找ename為Arwen的行記錄。

2、regexp_instr:

REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用於在x中查找pattern。返回pattern在x中出現的位置。匹配位置從1開始。可以參考字元串函數 INSTR(),參數相關:

'start' 開始查找的位置;

'occurrence' 說明應該返回第幾次出現pattern的位置;

'return_option' 說明應該返回什麼整數。若該參數為0,則說明要返回的整數是x中的一個字元的位置;若該參數為非0的整數,則說明要返回的整數為x中出現在pattern之後 的字元的位置;

'match_option' 修改默認的匹配設置.與regexp_like裡面的相同.

示例:

DECLARE

V_RESULT INTEGER ;

BEGIN

SELECT REGEXP_INSTR('hello world','o',1,1,0) INTO V_RESULT

FROM DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END;

結果為5,即字母o第一個次出現的位置。

如果regexp_instr('hello world','o',1,1,n)其中n為除0之外的整數。比如1,3。則結果為6.表示第一次出現字母o的後面一個字元的位置。

如果regexp_instr('hello world','o',1,2,0)則結果為9.表示第二次出現字母o的位置.

3、regexp_replace:

REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用於在x中查找pattern,並將其替換為replae_string。可以參考字元串函數 REPLACE(),參數同REGEXP_INSTR函數

示例:

DECLARE

V_RESULT varchar2(90);

BEGIN

SELECT REGEXP_REPLACE('hello world','o','x',1,1) INTO V_RESULT

FROM DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END;

結果為hellx world.

如果REGEXP_REPLACE('hello world','o','x'),則結果為hellx wxrld.

如果 REGEXP_REPLACE('hello world','o','x',1,2)則結果為hello wxrld.

4、regexp_substr:

REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]])用於在x中查找pattern並返回。可以參考字元串函數 SUBSTR(),參數同REGEXP_INSTR函數.

例如:

DECLARE

V_RESULT VARCHAR2(255);

BEGIN

SELECT REGEXP_SUBSTR('hello world','l{2}') INTO V_RESULT

FROM DUAL;

DBMS_OUTPUT.PUT_LINE(V_RESULT);

END ;

結果為ll

查詢到匹配的字元串才返回匹配的字元.沒查到就返回空。

❹ SQL 正則表達式

你好
說實話沒看懂你的意思
請你給一下數據,並且給一下你需要的結果
歡迎你追問吧,一定幫你搞定

❺ 求一SQL語句的正則表達式

like
'1[2345]'
or
=
'20'
sql的支持的模糊查詢正則功能很弱的
如果你要查id為15~20的記錄,直接用select就能完成
where
id
>=
15
and
id
<=
20
或者bewteen
如果是前15~20條記錄,用
select
top
6
*
from
(select
top
20
*
from
table
order
by
desc)
t

❻ SQL資料庫查詢使用正則表達式如何查詢中文

我不知道這算不算sql的正則表達式,它只模糊查詢但是可以達到正則表達式的效果select * from shop_yw where name2 between '李明' and '張明'select * from shop_yw where name2 like '%李%'select * from shop_yw where name2 like '[李明-張立]'select * from shop_yw where name2 like '[a-z]'select * from shop_yw where name2 like '-['李','趙']'select * from shop_yw where name2 like '[^a-f]'

❼ oracle SQL 正則表達式

正則表達式已經在很多軟體中得到廣泛的應用,包括*nix(Linux, Unix等),HP等操作系統,PHP,C#,Java等開發環境。
本文主要介紹了關於Oracle中正則表達式的使用方法,下面話不多說了,來一起看看詳細的介紹。
Oracle使用正則表達式離不開這4個函數:regexp_like、regexp_substr、regexp_instr、regexp_replace。
1、regexp_like
該函數只能用於條件表達式,和 like 類似,但是使用的正則表達式進行匹配
2、regexp_substr
該函數和 substr 類似,用於拾取合符正則表達式描述的字元子串
3、regexp_instr
該函數和 instr 類似,用於標定符合正則表達式的字元子串的開始位置
4、regexp_replace
該函數和 replace 類似,用於替換符合正則表達式的字元串

❽ sql正則表達式常用符號

SQL的查詢語句中,有時會需要引進正則表達式為其復雜搜索指定模式。下面給出一些Regexp在
MYSQL語句中應用(非全部):
1) ^
匹配字元串的開始部分。
mysql> SELECT 'fo\nfo' REGEXP '^fo$'; -> 0mysql> SELECT 'fofo' REGEXP '^fo'; -> 12) $
匹配字元串的結束部分。
mysql> SELECT 'fo\no' REGEXP '^fo\no$'; -> 1mysql> SELECT 'fo\no' REGEXP '^fo$'; -> 03) .
匹配任何字元(包括回車和新行)。
mysql> SELECT 'fofo' REGEXP '^f.*$'; -> 1mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$'; -> 14)
[:character_class:]
在括弧表達式中(使用[和]),[:character_class:]表示與術語類的所有字元匹配的字元類。標準的類名稱是:
alnum
文字數字字元
alpha
文字字元
blank
空白字元
cntrl
控制字元
digit
數字字元
graph
圖形字元
lower
小寫文字字元
print
圖形或空格字元
punct
標點字元
space
空格、製表符、新行、和回車
upper
大寫文字字元
xdigit
十六進制數字字元
它們代表在ctype(3)手冊頁面中定義的字元類。特定地區可能會提供其他類名。字元類不得用作范圍的端點。
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; -> 1
mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0
5) [[:<:]], [[:>:]]
這些標記表示word邊界。它們分別與word的開始和結束匹配。word是一系列字字元,其前面和後面均沒有字
字元。字字元是alnum類中的字母數字字元或下劃線(_)。
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1mysql> SELECT 'a xword a' REGEXP
'[[:<:]]word[[:>:]]'; -> 0要想在正則表達式中使用特殊字元的文字實例,應在其前面加上2個反斜杠「\」字元。
MySQL解析程序負責解釋其中一個,正則表達式庫負責解釋另一個。例如,要想與包含特殊字元「+」的字元
串「1+2」匹配,在下面的正則表達式中,只有最後一個是正確的:
mysql> SELECT '1+2' REGEXP '1+2'; -> 0mysql> SELECT '1+2' REGEXP '1\+2'; -> 0mysql> SELECT
'1+2' REGEXP '1\\+2'; -> 1 其他的有關Regexp的語法,可直接參考下表:字元 含意
\ 做為轉意,即通常在"\"後面的字元不按原來意義解釋,如/b/匹配字元"b",當b前面加了反斜桿後/\b/,轉意
為匹配一個單詞的邊界。
-或-
對正則表達式功能字元的還原,如"*"匹配它前面元字元0次或多次,/a*/將匹配a,aa,aaa,加了"\"後,/a\*/將
只匹配"a*"。
^ 匹配一個輸入或一行的開頭,/^a/匹配"an A",而不匹配"An a"
$ 匹配一個輸入或一行的結尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字元0次或多次,/ba*/將匹配b,ba,baa,baaa
+ 匹配前面元字元1次或多次,/ba*/將匹配ba,baa,baaa
? 匹配前面元字元0次或1次,/ba*/將匹配b,ba
(x) 匹配x保存x在名為$1...$9的變數中
x|y 匹配x或y
{n} 精確匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字元集(character set),匹配這個集合中的任一一個字元(或元字元)
[^xyz] 不匹配這個集合中的任何一個字元
[\b] 匹配一個退格符
\b 匹配一個單詞的邊界
\B 匹配一個單詞的非邊界
\cX 這兒,X是一個控制符,/\cM/匹配Ctrl-M
\d 匹配一個字數字元,/\d/ = /[0-9]/
\D 匹配一個非字數字元,/\D/ = /[^0-9]/
\n 匹配一個換行符
\r 匹配一個回車符
\s 匹配一個空白字元,包括\n,\r,\f,\t,\v等
\S 匹配一個非空白字元,等於/[^\n\f\r\t\v]/
\t 匹配一個製表符
\v 匹配一個重直製表符
\w 匹配一個可以組成單詞的字元(alphanumeric,這是我的意譯,含數字),包括下劃線,如[\w]匹配
"$5.98"中的5,等於[a-zA-Z0-9]
\W 匹配一個不可以組成單詞的字元,如[\W]匹配"$5.98"中的$,等於[^a-zA-Z0-9]。

❾ SQL語句 正則表達式

那就查後7位就好 select RIGHT(欄位,7) from table