这是我的输出
MUR,USD,EUR|SEM
我想这样
1) MUR,USD,EUR
2) SEM
我正在使用SQL Server。
答案 0 :(得分:1)
尝试一下(代码中的注释):
declare @tbl table(col varchar(100));
insert into @tbl values ('MUR,USD,EUR|SEM');
--select everything before the pipe
select SUBSTRING(col, 1, CHARINDEX('|', col) - 1)
from @tbl
union all
--union all with everything after the pipe
select SUBSTRING(col, CHARINDEX('|', col) + 1, LEN(col))
from @tbl
--alternative
select SUBSTRING(col, 1, CHARINDEX('|', col) - 1) BeforePipe,
SUBSTRING(col, CHARINDEX('|', col) + 1, LEN(col)) AfterPipe
from @tbl
答案 1 :(得分:1)
功能
CREATE FUNCTION [dbo].[fnSplitString]
( *emphasized text*
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
输出
SELECT * FROM DBO.fnSplitString('Querying | SQL Server','|')
答案 2 :(得分:1)
您可以创建一个像这样的函数并使用它:
CREATE FUNCTION dbo.SPLITTEXT(
@delimited NVARCHAR(MAX),
@delimiter NVARCHAR(100)
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
DECLARE @xml XML
SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
INSERT INTO @t(val)
SELECT r.value('.','varchar(MAX)') as item
FROM @xml.nodes('|') as records(r)
RETURN
END
以及当您使用此功能时
SELECT * FROM [dbo].[SPLITTEXT] ('MUR,USD,EUR|SEM.', ' ')
输出为
MUR,USD,EUR
SEM
答案 3 :(得分:1)
对于SQL Server 2016或更高版本,您可以这样做:
select T1.Value from STRING_SPLIT( 'MUR,USD,EUR|SEM' , '|' ) as T1
详细信息here