【SQL】sql版Split函数。用于拆分字符串为单列表格

原文:【SQL】sql版Split函数。用于拆分字符串为单列表格

功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行。可选是否移除空格子串和重复项。市面上类似的函数不算少,但大多都是在循环中对原串进行改动,我感觉这样不好,虽然不知道sql的字符串是不是像.net的一样具有不可变性,但感觉尽量不要去动原串最好,万一sql的字串也不可变,那变一次就要产生一份,尤其是每圈循环都在变,内存消耗让人心疼,所以才有重新造个轮子的想法。

另外,如果SQL开启了CLR支持,完全可以封装一个.net的Split到SQL里用,这样最简单,性能也应该更好(猜测)。不废话,上函数:

/*-------------------------------
函数:拆分字符串到单列表格v0.02
Author:AhDung
Update:201403251158
-------------------------------*/
ALTER FUNCTION dbo.Split(
@s VARCHAR(8000),             --要拆分的字符串
@separator NVARCHAR(10),      --分隔符。最长支持10个字符的分隔符
@removeEmpty BIT,             --是否移除空格项目。不处理制表符、回车换行
@unique BIT                   --是否移除重复项
)
RETURNS @t TABLE (S VARCHAR(500)) AS
BEGIN
  IF @s IS NULL RETURN

  IF CHARINDEX(@separator,@s)=0
  BEGIN INSERT @t VALUES(LEFT(@s,250)) RETURN END

  SET @s += @separator --仅对原串做一次改动。其实一次不改也行,但需要在循环中加判断。这样是为了在CPU和内存消耗之间取平衡
  DECLARE @lenS INT = LEN(@s),@lenSptr INT = DATALENGTH(@separator)/2,@i INT=0,@tmp NVARCHAR(250),@nextSptrIndex INT
  WHILE @i < @lenS
  BEGIN
    SET @nextSptrIndex=CHARINDEX(@separator,@s,@i+1)
    SET @tmp=SUBSTRING(@s,@i+1,@nextSptrIndex-1-@i)
    INSERT INTO @t VALUES(@tmp)
    SET @i+=DATALENGTH(@tmp)/2+@lenSptr
  END

  IF @removeEmpty=1
  BEGIN
  DELETE @t WHERE S=‘‘
  END

  IF @unique=1
  BEGIN
  WITH cteA AS (SELECT ROW_NUMBER() OVER(PARTITION BY S ORDER BY S) AS ‘ID‘ FROM @t)
  DELETE cteA WHERE ID<>1
  END

  RETURN
END

文毕!

时间: 2024-10-18 09:07:03

【SQL】sql版Split函数。用于拆分字符串为单列表格的相关文章

SQL中实现SPLIT函数几种方法总结

例1 代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(a varchar(100)) --实现split功能 的函数 --date :2003-10-14 as begin declare

SQL中实现SPLIT函数几种方法

例1 代码如下 复制代码 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))returns @temp table(a varchar(100))--实现split功能 的函数--date :2003-10-14as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@So

SQL Server用SPLIT函数分割字符串

SELECT *FROM Split('1,2,w,e,q', ',');

SQL中CONVERT()转化函数的用法 字符串转日期

1 SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM 2 SELECT CONVERT(varchar(100), GETDATE(), 1): 05/16/06 3 SELECT CONVERT(varchar(100), GETDATE(), 2): 06.05.16 4 SELECT CONVERT(varchar(100), GETDATE(), 3): 16/05/06 5 SELECT CONVERT(var

Split方法,拆分字符串后,去除返回的空值

     我们在使用Split('')方法的时候,根据指定的 '字符' 对字符串进行拆分,当'字符’为最后一个,将会拆分一个空值进行返回. 这个时候我们可以使用 string.Split(new char[] { '字符' }, StringSplitOptions.RemoveEmptyEntries); 这个方法进行去除这个空值

模拟java的split函数,分割字符串,类似于java的split方法

/*自定义oracle的分割函数*//*定义一个type,用户接收返回的数据集合*/create or replace type splitType as table of varchar2(4000); /* 参数1: 被分割的字符串 参数2:分割字符串,默认是英文逗号*/create or replace function split_str(str varchar2, split_char varchar2:=',') return splitType pipelinedis idx nu

Java用split函数进行分割字符串

在java中,我们常常需要对字符串进行分割,使用split方法把字符串按照指定的分割符进行分割,然后返回字符串数组,下面是string.split的用法实例及注意事项: public class StringSplit { public static void main(String[] args) { String sourceStr = "1,2,3,4,5"; String[] sourceStrArray = sourceStr.split(","); fo

oracle pl/sql split函数

在软件开发过程中程序员经常会遇到字符串的拼接和拆分工作. 以java开发为例: 前台传入字符串拼接形式的一个JSON数据,如:"1001,1002,1003",这可能代表了一组序号. 程序员需要将序号转名称后按照相同的格式输出,如:“张三.李四.王五”. Java程序员通用的做法是在service层将接收的"1001,1002,1003"拆分(使用java split函数),然后封装List,将List传递给DAO, 再传递给ORM持久层的xml调用sql执行,sq

应用C#和SQLCLR编写SQL Server用户定义函数

摘要: 文档阐述使用C#和SQLCLR为SQL Server编写用户定义函数,并演示用户定义函数在T-SQL中的应用.文档中实现的 Base64 编码解码函数和正则表达式函数属于标量值函数,字符串分割函数属于表值函数,而平方平均数函数属于聚合函数. 环境 要求:SQL Server 2005/2008,Visual Studio 2005/2008,C# 2.0. 本页内容 概述 启用SQLCLR Base64 编码解码函数 正则表达式函数 字符串分割函数 平方平均数函数 总结 概述 微软在推出