首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将字符串拆分为两列

将字符串拆分为两列
EN

Stack Overflow用户
提问于 2019-09-18 18:29:58
回答 5查看 157关注 0票数 1

我将以下字符串拆分为两列:

给定:

代码语言:javascript
复制
DECLARE @String VARCHAR(MAX) = 'Mak^1,Jak^2,Smith^3,Lee^4,Joseph^5'

我想把它分成两列:

代码语言:javascript
复制
column1  column2
-----------------
Mak      1
Jak      2
Smith    3
Lee      4
Joseph   5

我的尝试:

表值函数:

代码语言:javascript
复制
CREATE FUNCTION [dbo].[udf_Split]
(
@InputString VARCHAR(8000), 
@Delimiter VARCHAR(50)
)
RETURNS @Items TABLE (ID INTEGER IDENTITY(1,1), Item VARCHAR(8000))

AS
BEGIN
      IF @Delimiter = ' '
      BEGIN
            SET @Delimiter = ','
            SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
      END
      IF (@Delimiter IS NULL OR @Delimiter = '')
            SET @Delimiter = ','

      DECLARE @Item VARCHAR(8000)
      DECLARE @ItemList VARCHAR(8000)
      DECLARE @DelimIndex INT

      SET @ItemList = @InputString
      SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
      WHILE (@DelimIndex != 0)
      BEGIN
            SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
            INSERT INTO @Items VALUES (@Item)

            SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
            SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
      END -- End WHILE

      IF @Item IS NOT NULL 
      BEGIN
            SET @Item = @ItemList
            INSERT INTO @Items VALUES (@Item)
      END

      ELSE INSERT INTO @Items VALUES (@InputString)

      RETURN

END 

函数调用:

代码语言:javascript
复制
SELECT Item FROM [dbo].[udf_Split](@String ,',');

输出:

代码语言:javascript
复制
Item
--------------
Mak^1
Jak^2
Smith^3
Lee^4
Joseph^5
EN

Stack Overflow用户

发布于 2019-09-18 18:42:52

我觉得解决这个问题的更好的方法是去掉糟糕的WHILE,使用基于集合的方法;这里我们将使用delimitedsplit8K (如果您在2012+上使用delimitedsplit8k_lead,或者在2016+上可以使用STRING_SPLIT)。

考虑到这一点,上面的内容就变得相当微不足道:

代码语言:javascript
复制
DECLARE @String varchar(MAX) = 'Mak^1,Jak^2,Smith^3,Lee^4,Joseph^5';

SELECT LEFT(DS.Item,CHARINDEX('^',DS.Item)-1) AS Col1,
       STUFF(DS.Item,1, CHARINDEX('^',DS.Item),'') AS Col2
FROM dbo.DelimitedSplit8K(@String, ',') DS;
票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57990677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档