成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > SqlServer類似正則表達(dá)式的字符處理問題

SqlServer類似正則表達(dá)式的字符處理問題

熱門標(biāo)簽:優(yōu)質(zhì)地圖標(biāo)注 奧威地圖標(biāo)注多個地方 百度地圖標(biāo)注不同路線 怎樣在地圖上標(biāo)注路線圖標(biāo) 武漢長沙外呼系統(tǒng)方法和技巧 外呼系統(tǒng)電銷專用 千呼電銷機(jī)器人價格 京華物流公司地圖標(biāo)注 智能語音外呼系統(tǒng)選哪家

SQL Serve提供了簡單的字符模糊匹配功能,比如:like, patindex,不過對于某些字符處理場景還顯得并不足夠,日常碰到的幾個問題有:

1. 同一個字符/字符串,出現(xiàn)了多少次

2. 同一個字符,第N次出現(xiàn)的位置

3. 多個相同字符連續(xù),合并為一個字符

4. 是否為有效IP/身份證號/手機(jī)號等 

一. 同一個字符/字符串,出現(xiàn)了多少次

同一個字符,將其替換為空串,即可計算

declare @text varchar(1000)
declare @str varchar(10)
set @text = 'ABCBDBE'
set @str = 'B'
select len(@text) - len(replace(@text,@str,''))

同一個字符串,仍然是替換,因為是多個字符,方法1替換后需要做一次除法;方法2替換時增加一個字符,則不需要

--方法1
declare @text varchar(1000)
declare @str varchar(10)
set @text = 'ABBBCBBBDBBBE'
set @str = 'BBB'
select (len(@text) - len(replace(@text,@str,'')))/len(@str)
--方法2
declare @text varchar(1000)
declare @str varchar(10)
set @text = 'ABBBCBBBDBBBE'
set @str = 'BBB'
select len(replace(@text,@str,@str+'_')) - len(@text)

二. 同一個字符/字符串,第N次出現(xiàn)的位置

SQL SERVER定位字符位置的函數(shù)為CHARINDEX:

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

可以從指定位置起開始檢索,但是不能取第N次出現(xiàn)的位置,需要自己寫SQL來補(bǔ)充,有以下幾種思路:

1. 自定義函數(shù), 循環(huán)中每次為charindex加一個計數(shù),直到為N

if object_id('NthChar','FN') is not null
  drop function Nthchar
GO
create function NthChar
(
@source_string as nvarchar(4000), 
@sub_string  as nvarchar(1024),
@nth      as int
) 
returns int 
as 
begin 
  declare @postion int 
  declare @count  int 
  set @postion = CHARINDEX(@sub_string, @source_string) 
  set @count = 0 
  while @postion > 0 
  begin 
    set @count = @count + 1 
    if @count = @nth 
    begin 
      break 
    end
    set @postion = CHARINDEX(@sub_string, @source_string, @postion + 1) 
  End 
  return @postion 
end 
GO
--select dbo.NthChar('abcabc','abc',2)
--4

2. 通過CTE,對待處理的整個表字段操作, 遞歸中每次為charindex加一個計數(shù),直到為N

if object_id('tempdb..#T') is not null
  drop table #T
create table #T
(
source_string nvarchar(4000)
)
insert into #T values (N'我們我們')
insert into #T values (N'我我哦我')
declare @sub_string nvarchar(1024)
declare @nth    int
set @sub_string = N'我們'
set @nth = 2
;with T(source_string, starts, pos, nth) 
as (
  select source_string, 1, charindex(@sub_string, source_string), 1 from #t
  union all
  select source_string, pos + 1, charindex(@sub_string, source_string, pos + 1), nth+1 from T
  where pos > 0
)
select 
  source_string, pos, nth
from T
where pos > 0
 and nth = @nth
order by source_string, starts
--source_string  pos  nth
--我們我們  3  2

3. 借助數(shù)字表 (tally table),到不同起點(diǎn)位置去做charindex,需要先自己構(gòu)造個數(shù)字表

--numbers/tally table
IF EXISTS (select * from dbo.sysobjects where id = object_id(N'[dbo].[Numbers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
  DROP TABLE dbo.Numbers
--===== Create and populate the Tally table on the fly
 SELECT TOP 1000000 
    IDENTITY(int,1,1) AS number
  INTO dbo.Numbers
  FROM master.dbo.syscolumns sc1,
    master.dbo.syscolumns sc2
--===== Add a Primary Key to maximize performance
 ALTER TABLE dbo.Numbers
    ADD CONSTRAINT PK_numbers_number PRIMARY KEY CLUSTERED (number)
--===== Allow the general public to use it
 GRANT SELECT ON dbo.Numbers TO PUBLIC
--以上數(shù)字表創(chuàng)建一次即可,不需要每次都重復(fù)創(chuàng)建
DECLARE @source_string  nvarchar(4000), 
    @sub_string    nvarchar(1024), 
    @nth       int
SET @source_string = 'abcabcvvvvabc'
SET @sub_string = 'abc'
SET @nth = 2 
;WITH T 
AS
(      
SELECT ROW_NUMBER() OVER(ORDER BY number) AS nth,
    number AS [Position In String]
 FROM dbo.Numbers n 
 WHERE n.number = LEN(@source_string)  
  AND CHARINDEX(@sub_string, @source_string, n.number)-number = 0
  ----OR
  --AND SUBSTRING(@source_string,number,LEN(@sub_string)) = @sub_string
) 
SELECT * FROM T WHERE nth = @nth

4. 通過CROSS APPLY結(jié)合charindex,適用于N值較小的時候,因為CROSS APPLY的次數(shù)要隨著N的變大而增加,語句也要做相應(yīng)的修改

declare @T table
(
source_string nvarchar(4000)
)

insert into @T values
('abcabc'),
('abcabcvvvvabc')
declare @sub_string nvarchar(1024)
set @sub_string = 'abc'

select source_string,
    p1.pos as no1,
    p2.pos as no2,
    p3.pos as no3
from @T
cross apply (select (charindex(@sub_string, source_string))) as P1(Pos)
cross apply (select (charindex(@sub_string, source_string, P1.Pos+1))) as P2(Pos)
cross apply (select (charindex(@sub_string, source_string, P2.Pos+1))) as P3(Pos)

5. 在SSIS里有內(nèi)置的函數(shù),但T-SQL中并沒有

--FINDSTRING in SQL Server 2005 SSIS
FINDSTRING([yourColumn], "|", 2),
--TOKEN in SQL Server 2012 SSIS
TOKEN(Col1,"|",3)

注:不難發(fā)現(xiàn),這些方法和字符串拆分的邏輯是類似的,只不過一個是定位,一個是截取,如果要獲取第N個字符左右的一個/多個字符,有了N的位置,再結(jié)合substring去截取即可;

三. 多個相同字符連續(xù),合并為一個字符

最常見的就是把多個連續(xù)的空格合并為一個空格,解決思路有兩個:

1. 比較容易想到的就是用多個replace

但是究竟需要replace多少次并不確定,所以還得循環(huán)多次才行

--把兩個連續(xù)空格替換成一個空格,然后循環(huán),直到charindex檢查不到兩個連續(xù)空格
declare @str varchar(100)
set @str='abc    abc   kljlk   kljkl'
while(charindex(' ',@str)>0)
begin
  select @str=replace(@str,' ',' ')
end
select @str

2. 按照空格把字符串拆開

對每一段拆分開的字符串trim或者replace后,再用一個空格連接,有點(diǎn)繁瑣,沒寫代碼示例,如何拆分字符串可參考:“第N次出現(xiàn)的位置”;

四. 是否為有效IP/身份證號/手機(jī)號等

類似IP/身份證號/手機(jī)號等這些字符串,往往都有自身特定的規(guī)律,通過substring去逐位或逐段判斷是可以的,但SQL語句的方式往往性能不佳,建議嘗試正則函數(shù),見下。

五. 正則表達(dá)式函數(shù)

1. Oracle

從10g開始,可以在查詢中使用正則表達(dá)式,它通過一些支持正則表達(dá)式的函數(shù)來實現(xiàn):

Oracle 10 g
REGEXP_LIKE
REGEXP_REPLACE
REGEXP_INSTR
REGEXP_SUBSTR
Oracle 11g (新增)
REGEXP_COUNT

Oracle用REGEXP函數(shù)處理上面幾個問題:

(1) 同一個字符/字符串,出現(xiàn)了多少次

select length(regexp_replace('123-345-566', '[^-]', '')) from dual;
select REGEXP_COUNT('123-345-566', '-') from dual; --Oracle 11g 

(2) 同一個字符/字符串,第N次出現(xiàn)的位置

不需要正則,ORACLE的instr可以直接查找位置:

instr('source_string','sub_string' [,n][,m])

n表示從第n個字符開始搜索,缺省值為1,m表示第m次出現(xiàn),缺省值為1。

select instr('abcdefghijkabc','abc', 1, 2) position from dual; 

(3) 多個相同字符連續(xù),合并為一個字符

select regexp_replace(trim('agc f  f '),'\s+',' ') from dual; 

(4) 是否為有效IP/身份證號/手機(jī)號等

--是否為有效IP
WITH IP
AS(
SELECT '10.20.30.40' ip_address FROM dual UNION ALL
SELECT 'a.b.c.d' ip_address FROM dual UNION ALL
SELECT '256.123.0.254' ip_address FROM dual UNION ALL
SELECT '255.255.255.255' ip_address FROM dual
)
SELECT *
FROM IP
WHERE REGEXP_LIKE(ip_address, '^(([0-9]{1}|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1}|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$');
--是否為有效身份證/手機(jī)號,暫未舉例

2. SQL Server

目前最新版本為SQL Server 2017,還沒有對REGEXP函數(shù)的支持,需要通用CLR來擴(kuò)展,如下為CLR實現(xiàn)REG_REPLACE:

--1. 開啟 CLR 
EXEC sp_configure 'show advanced options' , '1'
GO
RECONFIGURE
GO
EXEC sp_configure 'clr enabled' , '1'
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options' , '0';
GO

 2. 創(chuàng)建 Assembly

--3. 創(chuàng)建 CLR 函數(shù)
CREATE FUNCTION [dbo].[regex_replace](@input [nvarchar](4000), @pattern [nvarchar](4000), @replacement [nvarchar](4000))
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER, RETURNS NULL ON NULL INPUT
AS 
EXTERNAL NAME [RegexUtility].[RegexUtility].[RegexReplaceDefault]
GO
--4. 使用regex_replace替換多個空格為一個空格
select dbo.regex_replace('agc f  f ','\s+',' ');

注:通過CLR實現(xiàn)更多REGEXP函數(shù),如果有高級語言開發(fā)能力,可以自行開發(fā);或者直接使用一些開源貢獻(xiàn)也行,比如:http://devnambi.com/2016/sql-server-regex/

小結(jié):

1. 非正則SQL語句的思路,對不同數(shù)據(jù)庫往往都適用;

2. 正則表達(dá)式中的規(guī)則(pattern) 在不同開發(fā)語言里,有很多語法是相通的,通常是遵守perl或者linux shell中的sed等工具的規(guī)則;

3. 從性能上來看,通用SQL判斷 > REGEXP函數(shù) > 自定義SQL函數(shù)。

總結(jié)

以上所述是小編給大家介紹的SqlServer類似正則表達(dá)式的字符處理問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • SQL Server中利用正則表達(dá)式替換字符串的方法
  • mysql 正則表達(dá)式查詢含有非數(shù)字和字符的記錄
  • MySQL 字符串模式匹配 擴(kuò)展正則表達(dá)式模式匹配

標(biāo)簽:來賓 威海 宿州 天水 益陽 銅仁 防疫戰(zhàn)設(shè) 七臺河

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SqlServer類似正則表達(dá)式的字符處理問題》,本文關(guān)鍵詞  SqlServer,類似,正則,表達(dá)式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SqlServer類似正則表達(dá)式的字符處理問題》相關(guān)的同類信息!
  • 本頁收集關(guān)于SqlServer類似正則表達(dá)式的字符處理問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    日本免费一区二区三区| www国产亚洲精品久久麻豆| 色中色777| 爱福利视频一区二区| 欧美日韩国产美女| 欧美久久一二区| 国产精品视频二区三区| 91成人入口| 精品国产自在精品国产浪潮| 91福利国产成人精品照片| 精品电影一区| 国产高清在线观看| 校花撩起jk露出白色内裤国产精品| 亚洲伊人网在线观看| 中文字幕在线观看91| 天堂av在线一区| 色噜噜偷拍精品综合在线| 嫩草视频在线免费观看| 精品人伦一区二区| 免费观看成人在线| 精品一区欧美| 天天做夜夜操| 日韩欧美亚洲精品| 亚洲另类图片另类电影| 亚洲国产一区二区三区在线播| 国产精品欧美大片| 日韩欧美国产一二三区| 久久久久国产精品视频| segui88久久综合9999| 在线观看二区| 欧美第一在线视频| 91在线看片| 另类视频在线| 成人做爰高清视频网站| 欧美人妖在线| 日韩精品91| 97人人爽人人爽人人爽| 久久久久久久久久久网| 免费电影网站在线观看| 免费在线观看不卡| 成人动漫视频在线观看免费| 欧美做受高潮1| jizzjizz欧美69巨大| 美女毛片在线观看| 欧美日韩人人澡狠狠躁视频| 日本高清视频免费在线观看| 国产丝袜在线精品| 亚洲色图在线看| 啦啦啦高清在线观看www| 亚洲国内精品| 久久亚洲私人国产精品va| 秋霞一区二区| 亚洲精品免费在线观看| 在线日韩av观看| 日韩电影免费在线| 欧美激情1区2区| 亚洲一区二区三区四区电影| 久久国产这里只有精品| 亚洲成人手机在线| 日本成人福利| 日韩视频在线观看视频| 久久的精品视频| 97**国产露脸精品国产| 亚洲色婷婷一区二区三区| 亚洲第一成人网站| 久久精品久久精品亚洲人| 日韩三级小视频| 久久国产毛片| 亚洲精品91在线| 欧美激情2020午夜免费观看| 国产美女高潮在线| 日本最新在线视频| 国产专区欧美精品| 国产裸体歌舞团一区二区| 日韩精品成人在线| 极品尤物久久久av免费看| 成年人视频观看| 国产精品丝袜一区二区三区| 中文字幕一二区| 亚洲七七久久综合桃花剧情介绍| 久久精品一区二区三| 国产一区二区波多野结衣| 日韩一级免费在线观看| 老司机精品视频在线播放| 成年人羞羞的网站| 免费看a在线观看| 亚洲成人av中文| 日韩欧美国产黄色| 91.成人天堂一区| 精品少妇一区二区三区日产乱码| 国内揄拍国内精品少妇国语| 成人激情动漫在线观看| 色先锋最新资源| 成人日韩在线观看| 日韩精品一区中文字幕| 国产精品熟妇一区二区三区四区| 欧美国产日韩一区二区三区| 亚洲女爱视频在线| 99精品视频在线观看免费| 国产精品一区二区三区免费视频| 情se视频网在线观看| 黄色成人免费观看| 秋霞午夜在线观看| 国产亚洲精品熟女国产成人| 欧美久久久久久久久中文字幕| 91蜜桃传媒精品久久久一区二区| 看全色黄大色黄大片免责看的| 亚洲线精品一区二区三区八戒| 午夜激情在线播放| 男人的天堂网av| 欧美性猛交xxxxbbbb| 中文字幕av在线| 亚洲欧洲一区二区福利| 97精品欧美一区二区三区| 国产精品日本精品| 日韩欧美国产亚洲| 欧美日韩一区二区三区高清| 亚洲综合在线视频| 国产欧美综合在线观看第十页| 欧美午夜精品久久久久久超碰| 99久热re在线精品996热视频| 97人人爽人人喊人人模波多| 久久久国产精品入口麻豆| 久久国际精品| 日本护士做爰视频| 国产日韩欧美二区| www.久久东京| 99热一区二区| 二个人看的毛片| 国产女优裸体网站| 亚洲欧美小视频| 色偷偷91综合久久噜噜| 高清中文字幕一区二区三区| 蜜桃久久久久| 欧美精品丝袜久久久中文字幕| 看欧美ab黄色大片视频免费| 综合亚洲色图| 国产人妻一区二区| 国产精品美女视频免费观看软件| 在线天堂中文www视软件| 亚洲天堂网av在线| yy111111少妇影院日韩夜片| 一本色道久久综合狠狠躁篇怎么玩| 欧美色网一区二区| 亚洲第一av在线| 欧美videossex| 久草精品在线| 一区二区精品视频在线观看| 精品国产乱码久久久久久牛牛| vam成人资源在线观看| 精品av导航| 亚洲一区二区三区久久| 先锋影音男人资源| jizzjizzjizz美国| 久久99最新地址| 78色国产精品| 国产一级在线观看视频| 国产日本在线| 中文文字幕文字幕高清| 欧美中文字幕在线观看| 欧美人与牲动交xxxxbbbb| 国产亚洲激情在线| 国模精品一区二区三区| 国语精品中文字幕| 免费又爽又黄禁片视频1000片| 大桥未久av一区二区三区| 国产白丝袜美女久久久久| 免费看三级黄色片| 亚洲精品在线观| 五月激情综合色| 9l视频白拍9色9l视频| 91青青在线视频| 欧美色播在线播放| 免费男女羞羞的视频网站中文字幕| 日本一区二区免费高清| 日本成人网址| 91高清在线观看视频| 私密视频在线观看| 亚洲国产精彩视频| 品久久久久久久久久96高清| 国产精区一区二区| 最近2019好看的中文字幕免费| 黄色成人在线看| 一区二区免费| 精品深夜av无码一区二区老年| www日本高清视频| 美女精品久久久| 26uuu国产电影一区二区| 欧美一区二区三区激情| 日韩电影免费观看高清完整版在线观看| 精品99一区二区| 日韩欧美高清在线观看| 一级肉体全黄裸片| 国产在线一二三| 亚洲丝袜另类动漫二区| 在线视频国产三级| 乱亲女秽乱长久久久| 97电影在线看视频| 成人小视频免费在线观看| 成人免费黄色网| 免费黄色成年网站| 色av成人天堂桃色av| 国产精品久久久精品| 另类亚洲自拍| 国产精品户外野外| 欧美a视频在线| xvideos国产在线视频| 91麻豆免费视频网站| 久久久久免费视频| aa视频在线播放| 最新在线中文字幕| 亚洲视频在线一区观看| 九九九热精品免费视频观看网站| 久久免费午夜影院| 国模大尺度视频一区二区| 中文字幕免费一区| 亚洲免费不卡视频| 日本成人在线一区| 欧美亚洲日本一区| 国产女优一区| 日韩不卡一区二区| 亚洲欧美激情另类校园| 欧美色图首页| 久久一日本道色综合| 欧美特级黄色片| 日韩超碰人人爽人人做人人添| www.99久久热国产日韩欧美.com| 无码人妻一区二区三区一| 色噜噜狠狠成人中文综合| 激情视频在线观看| 日韩欧美一区二区三区在线| 亚洲六月丁香色婷婷综合久久| 国产午夜精品一区在线观看| xfplay资源站色先锋在线观看| 免看一级a毛片一片成人不卡| 国产亚洲污的网站| 亚洲三区四区| 午夜性色一区二区三区免费视频| 亚洲精品中文字幕乱码三区| 日韩中文字幕视频| 91麻豆精品在线观看| 国产精品国产三级国产有无不卡| 成人免费网站在线看| 毛片大全在线观看| 成人免费观看在线视频| 亚洲欧美综合7777色婷婷| 疯狂撞击丝袜人妻| 日韩城人网站| 亚洲色图综合| 精品视频一区三区九区| 中文字幕九色91在线| av中文字幕亚洲| 五月婷婷丁香六月| 亚洲国产日韩欧美在线图片| 同心难改在线观看| 亚洲一二三区不卡| 美国十次综合久久| 日韩一区二区三区在线播放| 欧类av怡春院| 后入内射无码人妻一区| 亚洲国产精品成人va在线观看| 动漫美女被爆操久久久| 美女被男人操网站| 色综合久久久久综合体桃花网| 亚洲一卡二卡三卡四卡无卡网站在线看| 欧美视频精品全部免费观看| 香蕉污视频在线观看| 一个人www视频在线免费观看| 国产精品久久免费视频| 成人无码www在线看免费| 色综合888| 中文字幕亚洲视频| 91嫩草丨国产丨精品| 欧美少妇性性性| 日韩在线观看免费高清完整版| 国产精品视频麻豆| 精品女同一区二区三区在线播放| 欧美一区一区| 日韩av在线播放资源| 黄色片网站免费在线观看| 五月天av在线| 亚洲va欧美va人人爽成人影院| 丝袜国产免费观看| 成人免费自拍视频| 亚洲毛片亚洲毛片亚洲毛片| 国产中文字幕免费观看| 日韩麻豆第一页| 国产精品青草久久久久福利99| 青青一区二区| 国产精品午夜电影| 天堂av手机在线| 国产老肥熟xxxx在线观看| 国产亚洲精品一区二555| 最新日韩三级| 任你弄精品视频免费观看| 性色av一区二区怡红| 国产一级片免费| 国产天堂av| 亚洲日本无吗高清不卡| 亚洲人成人一区二区三区| 国产精品入口麻豆完整版| 欧美国产日韩一区二区三区| 欧美大片在线观看一区二区| 极品美女扒开粉嫩小泬| 精品人妻伦一二三区久| 中文字幕在线观看av| 亚洲美女久久精品| 久久久国产精品一区| 日韩精品一区国产麻豆| 国产精品乱码一区二区三区软件| 日韩美脚连裤袜丝袜在线| 午夜久久久精品| 亚洲图片在线观看| 国产免费999| 精品国产a一区二区三区v免费| 日韩手机在线视频| 四色永久网址| 国产精品三级久久久久三级| 午夜激情在线观看| 久久夜精品va视频免费观看| 91浏览器在线视频| 丰满人妻一区二区三区53视频| 亚洲精品久久久久久久蜜桃臀| 热re99久久精品国99热蜜月| 亚洲欧洲美洲国产香蕉| 毛片一级免费一级| 岛国精品一区二区三区| 国产一区二区免费在线观看|