T-SQL拆分使用指定分隔符的字符串(split string)

比如有一个表,我们需要些一个语句像SELECT OtherID, SplitData WHERE SomeID = ‘abcdef-.......‘ , 然后就能返回分割成单独的行。

原表:

| SomeID         | OtherID     | Data

+----------------+-------------+-------------------

| abcdef-.....   | cdef123-... | 18,20,22

| abcdef-.....   | 4554a24-... | 17,19

| 987654-.....   | 12324a2-... | 13,19,20

预期结果:

| OtherID     | SplitData

+-------------+-------------------

| cdef123-... | 18

| cdef123-... | 20

| cdef123-... | 22

| 4554a24-... | 17

| 4554a24-... | 19

在 SQL Server 2016中引入了分割字符串函数STRING_SPLIT(详细参考MSDN),可以方便的实现。

select OtherID, SplitData
from yourtable
cross apply STRING_SPLIT (Data, ‘,‘) cs

在SQL Server 2016之前,必须添加一个自定义函数,具体有两种实现方式.

1. XML解析法 -- 比较容易,适用于字符串能够转换为XML(不含有特殊字符也可以将特殊字符替换)

CREATE FUNCTION [dbo].[SplitString]
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN
   (
      SELECT Item = y.i.value(‘(./text())[1]‘, ‘nvarchar(4000)‘)
      FROM
      (
        SELECT x = CONVERT(XML, ‘<i>‘
          + REPLACE(@List, @Delimiter, ‘</i><i>‘)
          + ‘</i>‘).query(‘.‘)
      ) AS a CROSS APPLY x.nodes(‘i‘) AS y(i)
   );

2. 递归法

create function [dbo].[splitString](@input Varchar(max), @Splitter Varchar(99))
returns table as
Return
  with tmp (DataItem, List , First) as
   (
             select @input  ,@input,   1  --first item ignored, set to get the type right
     union all
     select LEFT(List, CHARINDEX(@Splitter,List+@Splitter)-1),
                                    STUFF(List, 1, CHARINDEX(@Splitter,List+@Splitter), ‘‘),
                                    0
             from tmp
             where List <> ‘‘
   )

   select DataItem from tmp where first=0

使用方法:

select OtherID, SplitData
from yourtable
cross apply dbo.splitString (Data, ‘,‘) cs
时间: 2024-10-23 00:50:52

T-SQL拆分使用指定分隔符的字符串(split string)的相关文章

13、如何拆分含有多种分隔符的字符串 14、如何判断字符串a是否以字符串b开头或结尾 15、如何调整字符串中文本的格式 16、如何将多个小字符串拼接成一个大的字符串

13.如何拆分含有多种分隔符的字符串 import re s = "23:41:2314\1234#sdf\23;" print(re.split(r'[#:\;]+',s))  14.如何判断字符串a是否以字符串b开头或结尾 import os,stat #找到当前目录下的文件名称,返回list ret = os.listdir('.') print(ret) for x in ret: #endswith传参类型是tuple if x.endswith(('.py','.html'

拆分含有多种分隔符的字符串

# 拆分含有多种分隔符的字符串 """实际案例: 把某个字符串依据分割符号拆分不同的字段,该字段包含多种不同的分隔符 list0 = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" 其中 <,>,<;>,<|>,<\> 都是分隔符""" # 单一分隔符使用 s = 'www 8596 0.0 0.0 15572 2136 pts/1 R+ 15:5

【笔记】如何拆分含有多种分隔符的字符串

把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符 方法一:连续使用str.split()方法,每次处理一种分隔符号 1 # encoding=utf-8 2 3 def mySplit(s,ds): 4 res = [s] 5 6 for d in ds: 7 t = [] 8 map(lambda x:t.extend(x.split(d)),res) 9 res = t 10 11 return [x for x in res if x] #能够将符号连续的点去掉空字段

python_如何拆分含有多种分隔符的字符串?

案例: 把某个字符串依据分隔符拆分,该字符包含不同的多种分隔符,如下 s = '12;;7.osjd;.jshdjdknx+' 其中 ; . + 是分隔符 有哪些解决方案? 方法1:通过str.split()方法,每次处理一个分隔符 #!/usr/bin/python3 def go_split(s, symbol): result = [s] for i in symbol: median = [] # 普通方法 # for x in result: # median.extend(x.spl

以指定分隔符串联字符串

对于String.Join(String, String[])这个方法,相信大家都有所了解.唯一不足的就是这个方法只能用于字符串数组,适用场景比较少.我所遇到的场景中,更多的是对List<T>中的某属性进行串联.尚未发现已实现该功能的方法,于是自己实现了该功能.实现的方式是对IEnumerable<T>进行扩展. /// <summary> /// 将数组合并成字符串,Action<<typeparamref name="T"/>,

python学习--如何拆分有多种分隔符的字符串

利用正则表达式 import re s='ab,cd:e\gg//aaa/kkk' re.split(r'[,:/\\]+',s)    #['ab', 'cd', 'e', 'gg', 'aaa', 'kkk']

(一)Python入门-2编程基本概念:17字符串-split()分割-join()合并-join()效率测试

一:split()分割 split()可以基于指定分隔符将字符串分隔成多个子字符串(存储到列表中).如果不指定分隔 符,则默认使用空白字符(换行符/空格/制表符).示例代码如下: 1 >>> a = "to be not to be" 2 3 >>> a.split() 4 5 ['to', 'be', 'not', 'to', 'be'] 6 >>> a.split("be") 7 8 ['to ', ' no

php将长字符串拆分为指定最大宽度的字符串数组

/** * 将字符串拆分为指定最大宽度的字符串数组.单字节字符宽度为1,多字节字符通常宽度为2 * @param string $msg 要拆分的字符串 * @param int $width 结果数组中每个元素的最大宽度.如10代表10个英文字母或者5个汉字 * @param string $enc 字符串编码 */ function split_str2array_cn($msg,$width,$enc = 'utf-8'){ $msg_width = mb_strwidth($msg,$e

字符串按指定分隔符分隔

/// <summary> /// 字符串按指定分隔符分隔 /// </summary> /// <param name="str">字符串</param> /// <param name="separator">分隔符</param> /// <returns></returns> public List<string> ConvertToStringLis