SQL 服务器分隔包含逗号的字符串
SQL Server seperate a string that contains commas
我对 SQL 服务器有点问题。
我有一个名为 "versionslist"
的专栏。
这个 versionslist
可以包含这样的东西 ->
'PVW3.50,UtP7.30,NTE8.39'
现在我想 PVW3.50 and Utp7.30 and NTE8.39
分开,但我不知道如何告诉 SQL 服务器逗号 ','
是一个分隔符并且它将不同的版本分开.
感谢您的帮助!
旧标准xml
解决方案:
SELECT Split.a.value('.', 'NVARCHAR(max)') AS ID
FROM (SELECT CAST ('<M>' + REPLACE(@List, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes('/M') AS Split ( a )
这里 @List
是您的逗号分隔列表。
例如,您可以使用 coalesce 做一个快捷方式,从 table 中的记录中连接一系列字符串。
declare @aa varchar (200)
set @aa = ''
select @aa =
coalesce (case when @aa = ''
then CarName
else @aa + ',' + CarName
end
,'')
from Cars
print @aa
您也可以通过创建用户定义的函数来实现。
函数:fn_Split
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
然后,
DECLARE @versions AS VARCHAR(MAX) = 'PVW3.50,UtP7.30,NTE8.39'
SELECT Value AS Versions FROM fn_Split(@versions,',');
OutPut
+----------+
| Versions |
+----------+
| PVW3.50 |
| UtP7.30 |
| NTE8.39 |
+----------+
我对 SQL 服务器有点问题。
我有一个名为 "versionslist"
的专栏。
这个 versionslist
可以包含这样的东西 ->
'PVW3.50,UtP7.30,NTE8.39'
现在我想 PVW3.50 and Utp7.30 and NTE8.39
分开,但我不知道如何告诉 SQL 服务器逗号 ','
是一个分隔符并且它将不同的版本分开.
感谢您的帮助!
旧标准xml
解决方案:
SELECT Split.a.value('.', 'NVARCHAR(max)') AS ID
FROM (SELECT CAST ('<M>' + REPLACE(@List, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A
CROSS APPLY Data.nodes('/M') AS Split ( a )
这里 @List
是您的逗号分隔列表。
例如,您可以使用 coalesce 做一个快捷方式,从 table 中的记录中连接一系列字符串。
declare @aa varchar (200)
set @aa = ''
select @aa =
coalesce (case when @aa = ''
then CarName
else @aa + ',' + CarName
end
,'')
from Cars
print @aa
您也可以通过创建用户定义的函数来实现。
函数:fn_Split
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ')
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
然后,
DECLARE @versions AS VARCHAR(MAX) = 'PVW3.50,UtP7.30,NTE8.39'
SELECT Value AS Versions FROM fn_Split(@versions,',');
OutPut
+----------+
| Versions |
+----------+
| PVW3.50 |
| UtP7.30 |
| NTE8.39 |
+----------+