SQL分割文本 - 是否可能

时间:2017-03-30 13:09:07

标签: sql-server tsql split

我想将文本从以下内容拆分为给定格式。 我的字符串格式为id,quantity|id,quantity|id,quantity

实施例:1,3|2,4|3,6|4,0

我想用以下格式:

Id     |       Quantity
1      |       3
2      |       4
3      |       6
4      |       0 

我需要完全查询以获得上述结果:

答案如下

IF EXISTS ( SELECT * from dbo.sysobjects WHERE id = object_id(N'[dbo].[doubleSplit]') 
        AND OBJECTPROPERTY(id, N'IsTableFunction') = 1 )
DROP FUNCTION [dbo].[doubleSplit] GO
CREATE FUNCTION dbo.doubleSplit ( 
    @sourceString varchar(MAX),
    @primaryDelimiter varchar(100),
    @secondaryDelimiter varchar(100) ) RETURNS @tblArray TABLE    (
Id smallint IDENTITY(1,1),
InventoryId varchar(MAX),
Quantity varchar(MAX)   ) AS BEGIN

DECLARE @primaryIndex smallint
DECLARE @secondaryIndex smallint
DECLARE @primaryStart smallint
DECLARE @secondaryStart smallint
DECLARE @primaryDelimiterSize smallint
DECLARE @seondaryDelimiterSize smallint
DECLARE @primaryElement varchar(MAX);
DECLARE @seondaryElement varchar(MAX);
SET @primaryDelimiterSize = LEN(@primaryDelimiter)
SET @seondaryDelimiterSize = LEN(@secondaryDelimiter)
--loop through source string and add elements to destination table array
WHILE LEN(@sourceString) > 0
BEGIN
    SET @primaryIndex = CHARINDEX(@primaryDelimiter, @sourceString)
    IF @primaryIndex = 0
    BEGIN
        SET @secondaryIndex = CHARINDEX(@secondaryDelimiter, @sourceString)
        IF @secondaryIndex = 0
        BEGIN
            INSERT INTO @tblArray (InventoryId, Quantity) VALUES(@sourceString, '')
        END
        ELSE
        BEGIN
            SET @secondaryStart = @secondaryIndex + @seondaryDelimiterSize;
            INSERT INTO @tblArray (InventoryId, Quantity) 
            VALUES(SUBSTRING(@sourceString, 1, @secondaryIndex - 1), 
                   SUBSTRING(@sourceString, @secondaryIndex + @seondaryDelimiterSize, LEN(@sourceString) - @secondaryStart + 1))
        END
        BREAK
    END
    ELSE
    BEGIN
        SELECT @primaryElement = SUBSTRING(@sourceString, 1, @primaryIndex - 1);
        SET @secondaryIndex = CHARINDEX(@secondaryDelimiter, @primaryElement)
        SET @secondaryStart = @secondaryIndex + @seondaryDelimiterSize;
        INSERT INTO @tblArray (InventoryId, Quantity) 
        VALUES(SUBSTRING(@primaryElement, 1, @secondaryIndex - 1), 
               SUBSTRING(@primaryElement, @secondaryIndex + @seondaryDelimiterSize, LEN(@primaryElement) - @secondaryStart + 1))
        SET @primaryStart = @primaryIndex + @primaryDelimiterSize
        SET @sourceString = SUBSTRING(@sourceString, @primaryStart , LEN(@sourceString) - @primaryStart + 1)
    END
END
RETURN END GO

SELECT Id,Quantity FROM dbo.doubleSplit('1,3|2,4|3,6|4,0|','|',',')

0 个答案:

没有答案