【997755.com澳门葡京】创办一个Scalar,截取字符串中最终三个国语词语

后天有赞助网民化解的个字符串截取的问题,《截取字符串中最后3个华语词语(MS
SQL)》
就算达成了,但始终感到代码写得很复杂。
MS SQL
Server中并未有三个就好像C#一样的函数LastIndexOf。未有,大家是足以创建2个Scalar-valued
Function函数的。

昨日有援助网络好友消除的个字符串截取的主题素材,《截取字符串中最后一个华语词语(MS
SQL)》
即便达成了,但平素认为代码写得很复杂。
MS SQL
Server中尚无一个就好像C#壹律的函数LastIndexOf。未有,我们是足以创制3个Scalar-valued
Function函数的。

有情侣须要2个主题材料,正是拍卖一张表中某一字段,从这么些字段中去截取内容中最终1个中文词语。

有对象需求一个主题素材,正是拍卖一张表中某一字段,从这几个字段中去截取内容中最后二个华语词语。

 997755.com澳门葡京 1

 997755.com澳门葡京 2

997755.com澳门葡京 3997755.com澳门葡京 4

997755.com澳门葡京 5997755.com澳门葡京 6

 

 

ID SourceText Result
1 张达:U:1杨英苹:U:1,周忱:U:1,;苗桥:U:1,章玮:U:1,; 
2 gaoying,高颖:U; 
3 gaoying,高颖:U; 
4 mq,苗桥;dingjian,丁健:U;zhangwei,章玮;zc,周忱; 
5 xwj,向文杰; 
6 dingjian,丁健; 
7 mq;chendeyong; 
8 gy,郭颖; 
9 houwenjun,侯文君;lj,李军;sunle,孙乐; 
10 dingjian,丁健:U; 
11 dingjian,丁健:U;zhangwei,章玮; 
12 wwm,王文明;zkl,张康亮;jiangyuan,蒋远;fyj,范云军; 
13 dingjian,丁健; 
14 fyj,范云军;wwm,王文明;zkl,张康亮; 
15 lww,陆维巍; 
ID SourceText  Result
1   张达:U:1杨英苹:U:1,周忱:U:1,;苗桥:U:1,章玮:U:1,;  
2   gaoying,高颖:U; 
3   gaoying,高颖:U; 
4   mq,苗桥;dingjian,丁健:U;zhangwei,章玮;zc,周忱;  
5   xwj,向文杰;   
6   dingjian,丁健;  
7   mq;chendeyong;  
8   gy,郭颖;    
9   houwenjun,侯文君;lj,李军;sunle,孙乐;  
10  dingjian,丁健:U;    
11  dingjian,丁健:U;zhangwei,章玮;  
12  wwm,王文明;zkl,张康亮;jiangyuan,蒋远;fyj,范云军;  
13  dingjian,丁健;  
14  fyj,范云军;wwm,王文明;zkl,张康亮; 
15  lww,陆维巍;   

 

【997755.com澳门葡京】创办一个Scalar,截取字符串中最终三个国语词语。 

Source Code

Source Code

997755.com澳门葡京 7997755.com澳门葡京 8

997755.com澳门葡京 9997755.com澳门葡京 10

 
开创一个张来存款和储蓄方面包车型客车数目:
997755.com澳门葡京 11

 
创办1个张来存款和储蓄方面的多少:
997755.com澳门葡京 12

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


CREATE FUNCTION [dbo].[svf_LastIndexOf]
(
    @OriginalCharacterString NVARCHAR(MAX),
    @Delimiter CHAR(1)
)
RETURNS INT
AS
BEGIN    
    RETURN LEN(@OriginalCharacterString) - CHARINDEX(@Delimiter, REVERSE(@OriginalCharacterString)) + 1
END
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


CREATE FUNCTION [dbo].[svf_LastIndexOf]
(
    @OriginalCharacterString NVARCHAR(MAX),
    @Delimiter CHAR(1)
)
RETURNS INT
AS
BEGIN    
    RETURN LEN(@OriginalCharacterString) - CHARINDEX(@Delimiter, REVERSE(@OriginalCharacterString)) + 1
END

997755.com澳门葡京 13997755.com澳门葡京 14

997755.com澳门葡京 15997755.com澳门葡京 16

Source Code

Source Code

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[DataSource](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SourceText] [nvarchar](100) NULL, --原始值
    [Result] [nvarchar](100) NULL --处理结果
) ON [PRIMARY]

GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[DataSource](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [SourceText] [nvarchar](100) NULL, --原始值
    [Result] [nvarchar](100) NULL --处理结果
) ON [PRIMARY]

GO

 

 

Source Code

Source Code

函数写好,大家举个小例子来演示一下:
997755.com澳门葡京 17

函数写好,大家举个小例子来演示一下:
997755.com澳门葡京 18

 

 

 

 

除此以外,你还要创立其余一张表,用来积累全部字符串中,分隔符号:
997755.com澳门葡京 19

别的,你还要成立其余一张表,用来囤积全体字符串中,分隔符号:
997755.com澳门葡京 20

想截取最终一个词语,截取初叶地点,从最后二个空格开始。

997755.com澳门葡京 ,想截取最终3个词语,截取开头地方,从最后1个空格伊始。

997755.com澳门葡京 21997755.com澳门葡京 22

997755.com澳门葡京 23997755.com澳门葡京 24

 

 

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Punctuation](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](2) NULL
) ON [PRIMARY]

GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Punctuation](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](2) NULL
) ON [PRIMARY]

GO

Source Code

Source Code

 

 

把具备分隔的标点,添出席此表中:
997755.com澳门葡京 25

把富有分隔的标点,添出席此表中:
997755.com澳门葡京 26

 

 

 

 

管理数据,我们供给分好次来实行,先去除字母和数字:
997755.com澳门葡京 27

拍卖数量,我们要求分好次来打开,先去除字母和数字:
997755.com澳门葡京 28

 

 

获得的结果:
997755.com澳门葡京 29

获得的结果:
997755.com澳门葡京 30

 

 

接下去,我们去除字符串的标点字符:
997755.com澳门葡京 31

接下去,大家去除字符串的标点字符:
997755.com澳门葡京 32

 

 

这一步,运维的结果如下:
997755.com澳门葡京 33

这一步,运营的结果如下:
997755.com澳门葡京 34

 

 

一发接近大家须要的结果了:
那儿,笔者急需对管理的结果,再次拍卖,得须求领会下边一个函数:
《应用XQuery的nodes()方法完结字符拆分》

《MS SQL
Server字符拆分函数》

一发接近大家要求的结果了:
这儿,作者索要对拍卖的结果,再度拍卖,得必要掌握下边贰个函数:
《运用XQuery的nodes()方法落成字符拆分》

《MS SQL
Server字符拆分函数》

其实三个函数,最后处理结果是一样的。就是分割字符串,然后放在一张表中

实质上2个函数,最后管理结果是一致的。正是分割字符串,然后放在一张表中

归来刚才的代码中,我们只管增多壹行代码就能够完结了大家的渴求:
997755.com澳门葡京 35

重回刚才的代码中,大家只管加多一行代码就可以完结了大家的渴求:
997755.com澳门葡京 36

997755.com澳门葡京 37997755.com澳门葡京 38

997755.com澳门葡京 39997755.com澳门葡京 40

    DECLARE @r INT = 1,@rs INT = 0
    SELECT @rs = MAX([ID]) FROM [dbo].[DataSource]

    WHILE @r <= @rs 
    BEGIN
        DECLARE @Text NVARCHAR(100)
        SELECT @Text = [SourceText] FROM [dbo].[DataSource] WHERE [ID] = @r

         WHILE PATINDEX('%[A-Za-z0-9]%',@Text) > 0     
            SET @Text = STUFF(@Text,PATINDEX('%[A-Za-z0-9]%',@Text),1,' ')          


        DECLARE @x INT = 1,@xs INT = 0
        SELECT @xs = MAX([ID]) FROM [dbo].[Punctuation]

        WHILE @x <= @xs
        BEGIN
            DECLARE @p NVARCHAR(2) 
            SELECT @p = [Name]  FROM [dbo].[Punctuation] WHERE [ID] = @x    
            SET @Text = RTRIM(LTRIM(REPLACE(@Text,@p,' ')))                
            SET @x = @x + 1
        END

        SELECT TOP 1 @Text = [WORD] FROM [dbo].[udf_Split](@Text,' ') WHERE LEN(ISNULL([WORD],''))> 0  ORDER BY [ID] DESC

        UPDATE  [dbo].[DataSource] SET [Result] = @Text  WHERE  [ID] = @r

        SET @r = @r + 1
    END
GO
    DECLARE @r INT = 1,@rs INT = 0
    SELECT @rs = MAX([ID]) FROM [dbo].[DataSource]

    WHILE @r <= @rs 
    BEGIN
        DECLARE @Text NVARCHAR(100)
        SELECT @Text = [SourceText] FROM [dbo].[DataSource] WHERE [ID] = @r

         WHILE PATINDEX('%[A-Za-z0-9]%',@Text) > 0     
            SET @Text = STUFF(@Text,PATINDEX('%[A-Za-z0-9]%',@Text),1,' ')          


        DECLARE @x INT = 1,@xs INT = 0
        SELECT @xs = MAX([ID]) FROM [dbo].[Punctuation]

        WHILE @x <= @xs
        BEGIN
            DECLARE @p NVARCHAR(2) 
            SELECT @p = [Name]  FROM [dbo].[Punctuation] WHERE [ID] = @x    
            SET @Text = RTRIM(LTRIM(REPLACE(@Text,@p,' ')))                
            SET @x = @x + 1
        END

        SELECT TOP 1 @Text = [WORD] FROM [dbo].[udf_Split](@Text,' ') WHERE LEN(ISNULL([WORD],''))> 0  ORDER BY [ID] DESC

        UPDATE  [dbo].[DataSource] SET [Result] = @Text  WHERE  [ID] = @r

        SET @r = @r + 1
    END
GO

Source Code

Source Code

 

 

结果如下:
997755.com澳门葡京 41

结果如下:
997755.com澳门葡京 42

 

 

OK,那正是促成的凡事经过。但是,大家应有不满足上面的代码。既然都选用正则来去除字母,数字,那标点符号能够使用正则来去除对吧。
因此说,我们不必再次创下造3个表来存款和储蓄标点符号了。

OK,那便是促成的整个进程。不过,大家应该不满足下边包车型大巴代码。既然都施用正则来去除字母,数字,那标点符号能够采纳正则来去除对啊。
因此说,大家不要再成立三个表来存款和储蓄标点符号了。

997755.com澳门葡京 43

997755.com澳门葡京 44

997755.com澳门葡京 45997755.com澳门葡京 46

997755.com澳门葡京 47997755.com澳门葡京 48

DECLARE @r INT = 1,@rs INT = 0
    SELECT @rs = MAX([ID]) FROM [dbo].[DataSource]

    WHILE @r <= @rs 
    BEGIN
        DECLARE @Text NVARCHAR(100)
        SELECT @Text = [SourceText] FROM [dbo].[DataSource] WHERE [ID] = @r

        WHILE PATINDEX('%[A-Za-z0-9:,;]%',@Text) > 0     
            SET @Text = STUFF(@Text,PATINDEX('%[A-Za-z0-9:,;]%',@Text),1,' ')

        SET @Text = LTRIM(RTRIM(@Text))


        SELECT TOP 1 @Text = [WORD] FROM [dbo].[udf_Split](@Text,' ') WHERE LEN(ISNULL([WORD],''))> 0  ORDER BY [ID] DESC

        UPDATE  [dbo].[DataSource] SET [Result] = @Text  WHERE  [ID] = @r

        SET @r = @r + 1
    END
DECLARE @r INT = 1,@rs INT = 0
    SELECT @rs = MAX([ID]) FROM [dbo].[DataSource]

    WHILE @r <= @rs 
    BEGIN
        DECLARE @Text NVARCHAR(100)
        SELECT @Text = [SourceText] FROM [dbo].[DataSource] WHERE [ID] = @r

        WHILE PATINDEX('%[A-Za-z0-9:,;]%',@Text) > 0     
            SET @Text = STUFF(@Text,PATINDEX('%[A-Za-z0-9:,;]%',@Text),1,' ')

        SET @Text = LTRIM(RTRIM(@Text))


        SELECT TOP 1 @Text = [WORD] FROM [dbo].[udf_Split](@Text,' ') WHERE LEN(ISNULL([WORD],''))> 0  ORDER BY [ID] DESC

        UPDATE  [dbo].[DataSource] SET [Result] = @Text  WHERE  [ID] = @r

        SET @r = @r + 1
    END

Source Code

Source Code

 

 

末段的结果1致,代码很了不知凡几!!!

最终的结果一致,代码很了过多!!!

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website