需要在管道'|'之后分割值

时间:2018-09-11 05:36:41

标签: sql sql-server sql-server-2008 sql-server-2008-r2

这是我的输出

MUR,USD,EUR|SEM

我想这样

1) MUR,USD,EUR
2) SEM

我正在使用SQL Server。

4 个答案:

答案 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