共計(jì) 4362 個(gè)字符,預(yù)計(jì)需要花費(fèi) 11 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 oracle sql 語言模糊查詢的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
oracle 在 Where 子句中,可以對(duì) datetime、char、varchar 字段類型的列用 Like 子句配合通配符選取那些“很像 …”的數(shù)據(jù)記錄,以下是可使用的通配符:
% 零或者多個(gè)字符
_ 單一任何字符(下劃線)
\ 特殊字符
oracle10g 以上支持正則表達(dá)式的函數(shù)主要有下面四個(gè):
1,REGEXP_LIKE:與 LIKE 的功能相似
2,REGEXP_INSTR:與 INSTR 的功能相似
3,REGEXP_SUBSTR:與 SUBSTR 的功能相似
4,REGEXP_REPLACE:與 REPLACE 的功能相似
POSIX 正則表達(dá)式由標(biāo)準(zhǔn)的元字符(metacharacters)所構(gòu)成:
^ 匹配輸入字符串的開始位置,在方括號(hào)表達(dá)式中使用,此時(shí)它表示不接受該字符集合。
$ 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,則 $ 也匹
配 \n 或 \r。
. 匹配除換行符之外的任何單字符。
? 匹配前面的子表達(dá)式零次或一次。
+ 匹配前面的子表達(dá)式一次或多次。
* 匹配前面的子表達(dá)式零次或多次。
| 指明兩項(xiàng)之間的一個(gè)選擇。例子 ^([a-z]+|[0-9]+)$ 表示所有小寫字母或數(shù)字組合成的
字符串。
() 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。
[] 標(biāo)記一個(gè)中括號(hào)表達(dá)式。
{m,n} 一個(gè)精確地出現(xiàn)次數(shù)范圍,m= 出現(xiàn)次數(shù) =n,{m} 表示出現(xiàn) m 次,{m,} 表示至少
出現(xiàn) m 次。
\num 匹配 num,其中 num 是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。
字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何數(shù)字。
[[:alnum:]] 任何字母和數(shù)字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大寫字母。
[[:lower:]] 任何小寫字母。
[[:punct:]] 任何標(biāo)點(diǎn)符號(hào)。
[[:xdigit:]] 任何 16 進(jìn)制的數(shù)字,相當(dāng)于 [0-9a-fA-F]。
各種操作符的運(yùn)算優(yōu)先級(jí)
\ 轉(zhuǎn)義符
(), (?:), (?=), [] 圓括號(hào)和方括號(hào)
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和順序
|
*/
其中關(guān)于條件,SQL 提供了四種匹配模式:
1,%:表示任意 0 個(gè)或多個(gè)字符。可匹配任意類型和長度的字符,有些情況下若是中文,請(qǐng)使用兩個(gè)百分號(hào)(%%)表示。
比如 SELECT * FROM [user] WHERE u_name LIKE % 三 %
將會(huì)把 u_name 為“張三”,“張貓三”、“三腳貓”,“唐三藏”等等有“三”的記錄全找出來。
另外,如果需要找出 u_name 中既有“三”又有“貓”的記錄,請(qǐng)使用 and 條件
SELECT * FROM [user] WHERE u_name LIKE % 三 % AND u_name LIKE % 貓 %
若使用 SELECT * FROM [user] WHERE u_name LIKE % 三 % 貓 %
雖然能搜索出“三腳貓”,但不能搜索出符合條件的“張貓三”。
2,_:表示任意單個(gè)字符。匹配單個(gè)任意字符,它常用來限制表達(dá)式的字符長度語句:
比如 SELECT * FROM [user] WHERE u_name LIKE _三_
只找出“唐三藏”這樣 u_name 為三個(gè)字且中間一個(gè)字是“三”的;
再比如 SELECT * FROM [user] WHERE u_name LIKE 三__
只找出“三腳貓”這樣 name 為三個(gè)字且第一個(gè)字是“三”的;
3. regexp_like 正則表達(dá)式函數(shù)查詢
-- 查詢 FieldName 中以 1 開頭 60 結(jié)束的記錄并且長度是 7 位
select * from fzq where FieldName like 1____60
select * from fzq where regexp_like(FieldName, 1....60
-- 查詢 FieldName 中以 1 開頭 60 結(jié)束的記錄并且長度是 7 位并且全部是數(shù)字的記錄。-- 使用 like 就不是很好實(shí)現(xiàn)了。select * from fzq where regexp_like(FieldName, 1[0-9]{4}60
-- 也可以這樣實(shí)現(xiàn),使用字符集。select * from fzq where regexp_like(FieldName, 1[[:digit:]]{4}60
-- 查詢 FieldName 中不是純數(shù)字的記錄
select * from fzq where not regexp_like(FieldName, ^[[:digit:]]+$
-- 查詢 FieldName 中不包含任何數(shù)字的記錄。select * from fzq where regexp_like(FieldName, ^[^[:digit:]]+$
-- 查詢以 12 或者 1b 開頭的記錄. 不區(qū)分大小寫。select * from fzq where regexp_like(FieldName, ^1[2b] , i
-- 查詢以 12 或者 1b 開頭的記錄. 區(qū)分大小寫。select * from fzq where regexp_like(FieldName, ^1[2B]
-- 查詢數(shù)據(jù)中包含空白的記錄。select * from fzq where regexp_like(FieldName, [[:space:]]
-- 查詢所有包含小寫字母或者數(shù)字的記錄。select * from fzq where regexp_like(FieldName, ^([a-z]+|[0-9]+)$
-- 查詢?nèi)魏伟瑯?biāo)點(diǎn)符號(hào)的記錄。select * from fzq where regexp_like(FieldName, [[:punct:]]
第一種
if test= AGTNAM !=null and AGTNAM !=
![CDATA[and AGTNAM like concat(concat( % ,#{AGTNAM}), % ))]]
/if
第二種
select id= selectUserByName parameterType= string resultType= user
select * from user where username like %${value}%
/select
備注:${}可以接收簡單類型值或 pojo 屬性值,如果 parameterType 傳輸單個(gè)簡單類型值,${}括號(hào)中只能是 value,使用 ${}不能防止 sql 注入,但是有時(shí)用 ${}會(huì)非常方便
日期的處理
1,數(shù)據(jù)庫里存的是 date 使用 insert 語句
insert into mytest_t values(1, 張三 ,to_date( 2011-09-09 , yyyy-MM-dd))
insert into mytest_t values(1, 張三 ,to_date( 20110909 , yyyyMMdd))
2,數(shù)據(jù)庫里面存的時(shí) varchar2 直接插入
insert into mytest_t values(1, zhangdan , 2011-09-09)
3,查詢,數(shù)據(jù)庫存的是 varchar2
日期輸出的格式是由 to_char 決定的
select to_char(to_date(birthday01, yyyy-mm-dd), yyyy-MM-dd ) from MYTEST_T 輸出是:yyyy-MM-dd
select to_char(to_date(birthday01, yyyy-mm-dd), yyyyMMdd ) from MYTEST_T 輸出是:yyyyMMdd
4,查詢,數(shù)據(jù)庫存的是 date
select to_char(birthday, yyyy-MM-dd) from MYTEST_T 格式 是由 to_char 決定的
select to_char(birthday, yyyyMMdd) from MYTEST_T
select to_char(sysdate, yyyy-MM-dd hh34:mi:ss) as nowTime from dual; // 日期轉(zhuǎn)化為字符串
select to_char(sysdate, yyyy) as myyear from mytest; // 獲取時(shí)間的年
select to_char(sysdate, mm) as myMonth from mytest; // 獲取時(shí)間的月
select to_char(sysdate, dd) as myDay from mytest; // 獲取時(shí)間的日
select to_char(sysdate, hh34) as myHour from mytest; // 獲取時(shí)間的時(shí)
select to_char(sysdate, mi) as myMinute from mytest; // 獲取時(shí)間的分
select to_char(sysdate, ss) as mySecond from mytest; // 獲取時(shí)間的秒
補(bǔ)充:
在學(xué)習(xí) mybatis 的學(xué)習(xí)中,用到模糊查詢的時(shí)候,發(fā)現(xiàn)直接拼接成‘% #{description} % 會(huì)報(bào)錯(cuò),然后整理了三種模糊查詢的 SQL 語句寫法:
1. 在傳參的時(shí)候,就把參數(shù)拼接為 % +#{description}+ % 然后傳到 XML 文件的 SQL 語句中,這樣就避免了在 SQL 語句中拼接出錯(cuò)(在 ORACLE 數(shù)據(jù)庫中或許會(huì)報(bào)“ORA-01722: 無效字符”錯(cuò)誤,針對(duì) ORACLE 可以修改成 % ||#{description}|| %)
2. 使用 SQL 的 concat 函數(shù) 在 SQL 語句進(jìn)行拼接,這樣拼接的 SQL 語句也是符合要求的,如:
SELECT * FROM MESSAGE WHERE DESCRIPTION like CONCAT(CONCAT( % ,#{description}), %
3. 使用 ${description}替換,#{description}就可以直接用 %${description}%,如:
SELECT * FROM MESSAGE WHERE DESCRIPTION like %${description}%
上面三種方式中,以第二種為最,幾乎無論什么情形都可以使用,而第一種和第三種都需要有一些前提條件才可以使用,不過在正常的工作中,幾乎都可以使用到這三種方法。今天整理出來,也為大家以后再次遇到這種情況提供一點(diǎn)小小的幫助。
注:第三種方法不推薦大家使用,有可能會(huì)出現(xiàn) sql 注入風(fēng)險(xiǎn)
以上是“oracle sql 語言模糊查詢的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!