Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将冒号中的数据拆分为新列_Sql_Sql Server - Fatal编程技术网

Sql 将冒号中的数据拆分为新列

Sql 将冒号中的数据拆分为新列,sql,sql-server,Sql,Sql Server,我有一个场景,我想把我的数据从冒号分割成新的列。 例如YR:136;年:50;JN:275;YM:138;年:477;WO:150;G1:10;F2:10 我要找的是: YR 136 YR 50 JN 275 YM 138 有人能告诉我如何做到这一点吗?任何帮助都将不胜感激。在SQL Server中,您可以使用STRING\u SPLIT实现这一点 有关更多信息,请阅读文档: 在SQL Server中,您可以使用STRING\u SPLIT执行此操作 有关更多信息,请阅读文档:

我有一个场景,我想把我的数据从冒号分割成新的列。 例如
YR:136;年:50;JN:275;YM:138;年:477;WO:150;G1:10;F2:10

我要找的是:

YR  136
YR   50
JN   275
YM   138

有人能告诉我如何做到这一点吗?任何帮助都将不胜感激。

在SQL Server中,您可以使用
STRING\u SPLIT
实现这一点

有关更多信息,请阅读文档:

在SQL Server中,您可以使用
STRING\u SPLIT
执行此操作

有关更多信息,请阅读文档:

对于SQL 2016及更高版本,您可以使用
STRING\u SPLIT
。如果没有,请搜索
CSV拆分器

declare @str varchar(100) = 'YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10'

select  parsename(replace(value, ':', '.'), 2),
        parsename(replace(value, ':', '.'), 1)
from    string_split(@str, ';')

对于SQL 2016及更高版本,您可以使用
STRING\u SPLIT
。如果没有,请搜索
CSV拆分器

declare @str varchar(100) = 'YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10'

select  parsename(replace(value, ':', '.'), 2),
        parsename(replace(value, ':', '.'), 1)
from    string_split(@str, ';')

首先创建函数:

CREATE FUNCTION dbo.fnSplit(
    @sInputList VARCHAR(8000) -- List of delimited items
  , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
 BEGIN
 SELECT
  @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

 IF LEN(@sItem) > 0
  INSERT INTO @List SELECT @sItem
 END

IF LEN(@sInputList) > 0
 INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
GO
输出:

A   B
YR  136
YR  50
JN  275
YM  138
IN  477
WO  150
G1  10
F2  10

首先创建函数:

CREATE FUNCTION dbo.fnSplit(
    @sInputList VARCHAR(8000) -- List of delimited items
  , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
 BEGIN
 SELECT
  @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

 IF LEN(@sItem) > 0
  INSERT INTO @List SELECT @sItem
 END

IF LEN(@sInputList) > 0
 INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
GO
输出:

A   B
YR  136
YR  50
JN  275
YM  138
IN  477
WO  150
G1  10
F2  10

希望字符串每次都以指定的格式显示。我所做的是,首先将相同的字符串复制到一个新变量,并添加一个额外的
结束。然后使用
WHILE
循环分割每个
之前的每个部分。然后使用
功能从拆分的零件中取出
之前和之后的零件。并将这些值插入表变量
@t

代码

declare @str as varchar(max) ='YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10';

declare @rows as int;
set @rows = len(@str) - len(replace(@str, ';',''));

declare @t as table([col1] varchar(100), [col2] int);

declare @i as int;
set @i = 0;

declare @str2 as varchar(max);
set @str2 = @str + ';';

while(@i <= @rows)
begin
    declare @col as varchar(100);
    set @col = left(@str2, charindex(';', @str2, 1) - 1);
    set @str2 = right(@str2, len(@str2) - charindex(';', @str2, 1));    
    insert into @t([col1], [col2])
    select 
        left(@col, charindex(':', @col, 1) - 1), 
        right(@col, charindex(':', reverse(@col), 1) - 1);
    set @i += 1;
end

select * from @t;
将@str声明为varchar(max)='YR:136;年:50;JN:275;YM:138;年:477;WO:150;G1:10;F2:10’;
将@rows声明为int;
设置@rows=len(@str)-len(替换(@str,“;”,”);
将@t声明为表([col1]varchar(100),[col2]int);
声明@i为int;
设置@i=0;
将@str2声明为varchar(max);
设置@str2=@str+';';

虽然(@i希望字符串每次都能以指定的格式显示。我所做的是,首先将同一字符串复制到一个新变量,并在末尾添加一个额外的
。然后使用
WHILE
循环在每个
之前拆分每个部分。然后使用
LEFT
RIGHT
函数在前后拆分各个部分r
从拆分的部分。并将这些值插入表变量
@t

代码

declare @str as varchar(max) ='YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10';

declare @rows as int;
set @rows = len(@str) - len(replace(@str, ';',''));

declare @t as table([col1] varchar(100), [col2] int);

declare @i as int;
set @i = 0;

declare @str2 as varchar(max);
set @str2 = @str + ';';

while(@i <= @rows)
begin
    declare @col as varchar(100);
    set @col = left(@str2, charindex(';', @str2, 1) - 1);
    set @str2 = right(@str2, len(@str2) - charindex(';', @str2, 1));    
    insert into @t([col1], [col2])
    select 
        left(@col, charindex(':', @col, 1) - 1), 
        right(@col, charindex(':', reverse(@col), 1) - 1);
    set @i += 1;
end

select * from @t;
将@str声明为varchar(max)='YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10';
将@rows声明为int;
设置@rows=len(@str)-len(替换(@str,“;”,”);
将@t声明为表([col1]varchar(100),[col2]int);
声明@i为int;
设置@i=0;
将@str2声明为varchar(max);
设置@str2=@str+';';
而(@i--对于SQL SERVER 2016+

DECLARE @str VARCHAR(100) = 'YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10'

SELECT    SUBSTRING(value,0,CHARINDEX(':',value,0)) Id 
        , SUBSTRING(value,CHARINDEX(':',value,0)+1,100) Vals
FROM    STRING_SPLIT(@str, ';')
--对于较旧的SQL SERVER

DECLARE @x AS XML=''
SET @x = CAST('<A>'+ REPLACE(@str,';','</A><A>')+ '</A>' AS XML)
SELECT SUBSTRING(t.value('.', 'VARCHAR(MAX)') ,0,CHARINDEX(':',t.value('.', 'VARCHAR(MAX)') ,0)) Id  
     , SUBSTRING(t.value('.', 'VARCHAR(MAX)') ,CHARINDEX(':',t.value('.', 'VARCHAR(MAX)') ,0)+1,100) Vals
FROM @x.nodes('/A') AS x(t)
将@x声明为XML=''
将@x=CAST(“”+REPLACE(@str,“;”,“”)+”设置为XML)
选择子字符串(t.value('.','VARCHAR(MAX)')、0、CHARINDEX(':'、t.value('.','VARCHAR(MAX)')、0))Id
,子字符串(t.value('.','VARCHAR(MAX')),CHARINDEX(':',t.value('.','VARCHAR(MAX')),0)+1100)VAL
从@x.nodes('/A')到x(t)
--适用于SQL SERVER 2016+

DECLARE @str VARCHAR(100) = 'YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10'

SELECT    SUBSTRING(value,0,CHARINDEX(':',value,0)) Id 
        , SUBSTRING(value,CHARINDEX(':',value,0)+1,100) Vals
FROM    STRING_SPLIT(@str, ';')
--对于较旧的SQL SERVER

DECLARE @x AS XML=''
SET @x = CAST('<A>'+ REPLACE(@str,';','</A><A>')+ '</A>' AS XML)
SELECT SUBSTRING(t.value('.', 'VARCHAR(MAX)') ,0,CHARINDEX(':',t.value('.', 'VARCHAR(MAX)') ,0)) Id  
     , SUBSTRING(t.value('.', 'VARCHAR(MAX)') ,CHARINDEX(':',t.value('.', 'VARCHAR(MAX)') ,0)+1,100) Vals
FROM @x.nodes('/A') AS x(t)
将@x声明为XML=''
将@x=CAST(“”+REPLACE(@str,“;”,“”)+”设置为XML)
选择子字符串(t.value('.','VARCHAR(MAX)')、0、CHARINDEX(':'、t.value('.','VARCHAR(MAX)')、0))Id
,子字符串(t.value('.','VARCHAR(MAX')),CHARINDEX(':',t.value('.','VARCHAR(MAX')),0)+1100)VAL
从@x.nodes('/A')到x(t)

尝试以下功能

CREATE FUNCTION [dbo].[udf_GetUnsplitGivenData]
(
@string nvarchar(max)
)
RETURNS  @OutTable TABLE
(
COl1 nvarchar(max),
COl2 nvarchar(max)
)
AS
BEGIN

    DECLARE @Temp AS TABLE
    (
    DATA nvarchar(max)
    )
    INSERT INTO @Temp
    SELECT @string


    INSERT INTO @OutTable(COl1,COl2)
    SELECT  SUBSTRING(Data,1,CHARINDEX(':',Data )-1) AS COl1,
            SUBSTRING(Data,CHARINDEX(':',Data )+1,LEN(Data)) AS COl2
    FROM
    (
    SELECT  Split.a.value('.','nvarchar(100)') AS Data 
    FROM
    (
    SELECT 
    CAST( '<S>'+REPLACE(Data,';','</S><S>')+'</S>' AS XML ) AS Data 
    FROM @Temp
    ) AS A
    CROSS APPLY data.nodes('S') AS Split(a)
    )dt


RETURN
END
SELECT * FROM [dbo].[udf_GetUnsplitGivenData] (
  'YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10')
GO

尝试下面的功能

CREATE FUNCTION [dbo].[udf_GetUnsplitGivenData]
(
@string nvarchar(max)
)
RETURNS  @OutTable TABLE
(
COl1 nvarchar(max),
COl2 nvarchar(max)
)
AS
BEGIN

    DECLARE @Temp AS TABLE
    (
    DATA nvarchar(max)
    )
    INSERT INTO @Temp
    SELECT @string


    INSERT INTO @OutTable(COl1,COl2)
    SELECT  SUBSTRING(Data,1,CHARINDEX(':',Data )-1) AS COl1,
            SUBSTRING(Data,CHARINDEX(':',Data )+1,LEN(Data)) AS COl2
    FROM
    (
    SELECT  Split.a.value('.','nvarchar(100)') AS Data 
    FROM
    (
    SELECT 
    CAST( '<S>'+REPLACE(Data,';','</S><S>')+'</S>' AS XML ) AS Data 
    FROM @Temp
    ) AS A
    CROSS APPLY data.nodes('S') AS Split(a)
    )dt


RETURN
END
SELECT * FROM [dbo].[udf_GetUnsplitGivenData] (
  'YR:136;YR:50;JN:275;YM:138;IN:477;WO:150;G1:10;F2:10')
GO

基于该CSV字符串的输出中显示了多少列?基于该CSV字符串的输出中显示了多少列的可能重复项?的可能重复项应该是
string\u SPLIT
应该是
string\u SPLIT
string\u SPLIT
仅来自
Sql Server 2016
string\u SPLIT
仅适用于2016年服务器。