SQLServer字符串查找(判斷字符串是否含中文,數字或字母),並把是否含中文作為條件來執行一些操作


 

 

 

從sqlserver中提取數據如何截取字符

 

1、LOCATE(substr , str ):返回子串 substr 在字符串 str 中第一次出現的位置,如果字符substr在字符串str中不存在,則返回0;
2、POSITION(substr IN str ):返回子串 substr 在字符串 str 中第一次出現的位置,如果字符substr在字符串str中不存在,與LOCATE函數作用相同;
3、LEFT(str, length):從左邊開始截取str,length是截取的長度;
4、RIGHT(str, length):從右邊開始截取str,length是截取的長度;
5、SUBSTRING_INDEX(str ,substr ,n):返回字符substr在str中第n次出現位置之前的字符串;
6、SUBSTRING(str ,n ,m):返回字符串str從第n個字符截取到第m個字符;
7、REPLACE(str, n, m):將字符串str中的n字符替換成m字符;
8、LENGTH(str):計算字符串str的長度。

 

 

是否包含中文基本原理:字符的 unicode編碼范圍。

0~9 : 48~57
A~Z :65 ~ 90
a~z : 97~ 122

–漢字unicode編碼范圍:[0x4e00,0x9fa5](或十進制[19968,40869])

SELECT * FROM dbo.person  WHERE UNICODE(字段) BETWEEN 19968 AND 40869

判斷字符串中含有中文:SELECT * FROM tb WHERE PATINDEX('%[啊-座]%',FieldName)>0

                              或: SELECT * FROM tb WHERE PATINDEX('%[吖-座]%',FieldName)>0

       注意:N'%[吖-座]%' 不適用於英文版或國外的SQLServer環境。 (<0 不含中文)

      通用性最好的還是   UNICODE(字段) BETWEEN 19968 AND 40869 ,但不好做判斷

-- 判斷是否不含中文
IF( select top(1) PATINDEX(N'%[吖-座]%',Description) From ZZZ_Aegis_ADSN  ) <=0
   select 1
else  
  select 0

 

 

/* 判斷是否包含中文,並把是否含中文作為條件來執行一些操作  */
IF( select top(1) PATINDEX('%[吖-座]%',ApplyName) From [B_00TEST]  ) >0
select 1
else  select 0

--這個不能作為IF的條件,只能查詢到具體信息
SELECT top(1) * FROM [B_00TEST] WHERE PATINDEX(N'%[吖-座]%',ApplyName) <=0

IF( UNICODE(N'啊111') BETWEEN 19968 AND 40869 )  select 1  else  select 0

IF( UNICODE(N'Abc111') BETWEEN 19968 AND 40869 )  select 1  else  select 0  --中文''前面要加N

  

 

通配符:[] 

FieldName like '[a-zA-Z]%'  --------- ([]指定值的范圍)
FieldName like '[^F-M]%'    --------- (^排除指定范圍)

 

SQLServer中判斷是否包含數字

sql2005有個函數ISNUMERIC(expression)函數:當expression為數字時,返回1,否則返回0。這只是一個菜鳥級的解決辦法,大多數情況比較奏效。

eg:

select ISNUMERIC('123') --結果為1

但是,該函數有個缺點!

eg:

復制代碼
 SELECT 
 ,ISNUMERIC('-') as '-'    --1
 ,ISNUMERIC('+') as '+'    --1
 ,ISNUMERIC('$') as '$'    --1
 ,ISNUMERIC('.') as '.'    --1
 ,ISNUMERIC(',') as ','    --1
 ,ISNUMERIC('\') as '\'    --1
 ,ISNUMERIC('2D3') AS '2D3'--1
,ISNUMERIC('1d1') AS '1d1'--1
,ISNUMERIC('1e1') AS '1e1'--1
,ISNUMERIC('d') AS 'd'   --0
復制代碼

當含有美元符、加減號、逗號等符號時,或者D、E的前后均出現數字時,也會返回1,這就比較頭疼了。標點符號倒是好理解,為什么d,e這種情況,真是不理解微軟設計的意圖。

有什么好的解決辦法嗎?當然了,請看下面

方法:通配符。高逼格使用。

適用場景:2005及以上(2005之前的版本沒試過,應該也支持)

 --返回0-則為純數字(支持正負數,小數點)
 SELECT PATINDEX('%[^0-9|.|-|+]%','2.2')--返回0

 --返回0-則為純整數
select PATINDEX('%[^0-9]%', '2.2') --返回 非0的位置

 

 

SQLserver中字符串查找功能patindex和charindex的區別

SQL server中patindexh和charindex函數,都可以在一段字符中搜索字符或字符串。
主要區別在:patindex函數支持使用通配符來進行搜索,charindex不支持通配符。
一、patindex函數

語法格式:patindex ( %pattern% , expression )
pattern:是要搜索的字符串
expression:是被搜索的字符串。
patindex函數返回字符或字符串在另一個字符串或表達式中的起始位置。
patindex函數支持搜索字符串中使用通配符,這也是patindexh和charindex函數主要的區別。
例:
patindex(%bc%,abcd) --返回:2
patindex(ab%,abcd) --返回:1
SQL中可以使用的通配符有:
1、%,替代一個或多個字符
2、_,僅替代一個字符
3、[charlist],字符列中的任何單一字符
4、[^charlist]或者[!charlist],不在字符列中的任何單一字符
二、charindex 函數
語法格式:charindex ( expression1 , expression2 [ , start_location ] )
expression1:是在expression2中尋找的字符
start_location:是charindex函數開始在expression2中找expression1的位置
charindex函數返回一個整數,返回的整數是要找的字符串在被找的字符串中的位置。假如charindex沒有找到要找的字符串,那么函數整數0。
例:
charindex(sql, microsoft sql server) --返回:11
charindex(7.0, microsoft sql server 2000) --返回:0

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM