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年服务器。