MSSQL—字符串分离(Split函数)

摘要:
如上所述,当需要合并记录时,必须有分离要求。说到字符串分离,您必须想到SPLIT函数NET、Java和JS都有函数。不幸的是,SQLSERVER中没有这样的函数。我们只能自己编写这样的函数。

前面提到了记录合并,有了合并需求肯定也会有分离需求,说到字符串分离,大家肯定会想到SPLIT函数,这个在.NET,Java和JS中都有函数,很可惜在SQL SERVER中没有,我们只能自己来写这么一个函数。

首先来分析一下怎么写这个函数,以之前合并的字符串为例,“张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”,现在要将此字符串按照“,”进行分离得到一组数据,现在可以得出这个函数传入变量有两个,一个是目标字符串,我们定义为@string,数据类型为nvarchar(500),选择nvarchar()是为了兼顾所有Unicode字符集,比如中文;另一个变量为分隔符,我们定义为@separator,数据类型为nvarchar(10),输出变量则定义为@array,一个单列列名为String,数据类型为nvarchar(500)的Table。

下面来分析具体的拆分方法,以字符串“张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”为例,首先得找到第一个“,”,然后把“张三”截取出来,然后将目标字符串变成“李四,王五,钱六,赵七,Tom,Amy,Joe,Leo”,然后再找第一个“,”,把“李四”截取出来,依次类推,直到找不到“,”,有了这个思路,下面就直接实现,查找字符串在程序语言中一般用indexOf方法,截取一般用Substring方法,SQL SERVER中有SUBSTRING函数用来截取字符串,但是没有indexOf查找函数,取而代之的是CHARINDEX和PATINDEX函数,CHARINDEX用于完全匹配查找,而PATINDEX用于模糊匹配查找,根据我们的需求,选用CHARINDEX函数,整个SPLIT函数代码如下:

CREATE FUNCTION [dbo].[SPLIT] 

(

-- Add the parameters for the function here

@string nvarchar(500),  

    @separator nvarchar(10) 

)

RETURNS @array TABLE(String nvarchar(500)) 

AS

BEGIN

-- Declare the return variable here

DECLARE @separatorIndex int,@tempString nvarchar(500),@tagString nvarchar(500)

-- Add the T-SQL statements to compute the return value here

    SET @tagString=@string

SET @separatorIndex=CHARINDEX(@separator,@tagString)  

    WHILE(@separatorIndex<>0)

BEGIN

        SET @tempString = SUBSTRING(@tagString,1,@separatorIndex-1)  

        INSERT INTO @array(String) VALUES(@tempString)  

        SET @tagString = SUBSTRING(@tagString,@separatorIndex+1,LEN(@tagString)-@separatorIndex)  

        SET @separatorIndex=CHARINDEX(@separator,@tagString)  

    END  

    SET @tempString = @tagString  

    IF (LEN(@tempString)>0)  

        INSERT INTO @array(String) VALUES(@tagString)  

-- Return the result of the function

RETURN

END

GO

接着测试一下:

SELECT * FROM dbo.SPLIT(N'张三,李四,王五,钱六,赵七,Tom,Amy,Joe,Leo',',')

可以得到如下结果:

image

免责声明:文章转载自《MSSQL—字符串分离(Split函数)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇查看SQL-SERVER数据库及各个表的数据量及占用空间大小Bind for 0.0.0.0:80 failed: port is already allocated.解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java日期时间

Java日期时间 Java.util包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。 第一个构造函数使用当前日期和时间来初始化对象。 Date() 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。 Date(long millisec) Date对象创建以后,可以调用下面的方法。   获...

两种访问接口的方式(get和post)

跨机器、跨语言的远程访问形式一共有三种:scoket发送数据包、http发送请求、rmi远程连接; http发送请求方式;分为post和get两种方式 importjava.io.IOException; importjava.io.InputStream; import java.util.Map; importjava.util.concurre...

ONNX-开放式神经网络交换格式

以下内容根据个人理解整理而成,如有错误,欢迎指出,不胜感激。 1. ONNX简介 ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互。 ONNX的规范及代码主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同开发,以开放源代码的方式...

Jquery easyui教程

目  录 1基本拖放................................................................................................................................................... 4 2构建购物车型拖放..........

phpmyadmin误删表后的恢复过程(心惊胆跳啊)

话说今天不知道是抽风了还是失魂了,在用phpmyadmin删除测试数据时,竟然将整个表删除了: 等程序运行出错时,才出现整个表都没有了,而且之前也没有备份好!这下蛋疼了,这个可是production服务器,里面的数据可不能丢啊! 服务器是linux的,我不是很熟悉,也不知道mysql装在哪。 无奈之下,google,发现有不少人也有像我一样犯傻的一回,...

php pack、unpack、ord 函数使用方法

string pack ( string $format [, mixed $args [, mixed $... ]] ) Pack given arguments into a binary string according to format. The idea for this function was taken from Perl and a...