разделить одно значение на несколько значений


0 принят

Отказ от ответственности: вы можете использовать функцию fn_split, я просто не использую ее из-за моей версии SQL.

Я не знаю, как разделить на отдельные столбцы или вручную, поэтому вы можете использовать несколько substringфункций для выполнения того, что вы пытаетесь сделать.

@Remarks varchar(100) = 'Product1~2,Product2~1', @Delimiter VARCHAR(1) = ','
DECLARE @Products TABLE(Product VARCHAR(MAX))

;WITH Split_CTE (startPostion, endPosition)
    AS (
        SELECT CAST(0 AS INT) AS startPostion
        ,CHARINDEX(@Delimiter, @Remarks) AS endPosition
        UNION ALL
        SELECT  endPosition + 1 
        ,CHARINDEX(@Delimiter, @Remarks, endPosition + 1) 
        FROM        Split_CTE
        WHERE       endPosition > 0
    )
INSERT INTO @Products
SELECT  SUBSTRING(@Remarks,startPostion, COALESCE(NULLIF(endPosition,0),LEN(@Remarks) + 1) - startPostion) AS [Data]
FROM Split_CTE

SELECT SUBSTRING([Product], CHARINDEX('~', [Product]) + 1, LEN([Product])) AS Id
,SUBSTRING([Product], 0, CHARINDEX('~', [Product])) AS Product
FROM @Products

0

Существует также способ сделать это с помощью XML, который может показаться вам интересным:

DECLARE @Remarks varchar(100) = 'Product1~2,Product2~1'

-- set up some variables for customizing the delimiters and parsing into XML
DECLARE @xml as xml
    ,@str as varchar(100)
    ,@str2 as varchar(100)
    ,@delimiter as varchar(10)
    ,@delimiter2 as varchar(10)

-- initialize using the values you provided
SET @delimiter ='~'
SET @delimiter2 =','
SET @str = @Remarks

-- convert your string to XML
SET @str2 = ('<val>'+replace(@str,@delimiter ,'</val><qty>')+'</qty>')
SET @xml = cast(('<rec>'+replace(@str2,@delimiter2 ,'</qty></rec><rec><val>')+'</rec>') as xml)

-- SQL using XQuery
SELECT 
  ref.value('val[1]', 'varchar(10)') AS value,
  ref.value('qty[1]', 'varchar(10)') AS quantity
FROM @xml.nodes('/rec') 
xmlData( ref )

И результат:

value      quantity
---------- ----------
Product1   2
Product2   1

(2 row(s) affected)
SQL, SQL-сервер,

sql,sql-server,

1

Ответов: 2


0 принят

Отказ от ответственности: вы можете использовать функцию fn_split, я просто не использую ее из-за моей версии SQL.

Я не знаю, как разделить на отдельные столбцы или вручную, поэтому вы можете использовать несколько substringфункций для выполнения того, что вы пытаетесь сделать.

@Remarks varchar(100) = 'Product1~2,Product2~1', @Delimiter VARCHAR(1) = ','
DECLARE @Products TABLE(Product VARCHAR(MAX))

;WITH Split_CTE (startPostion, endPosition)
    AS (
        SELECT CAST(0 AS INT) AS startPostion
        ,CHARINDEX(@Delimiter, @Remarks) AS endPosition
        UNION ALL
        SELECT  endPosition + 1 
        ,CHARINDEX(@Delimiter, @Remarks, endPosition + 1) 
        FROM        Split_CTE
        WHERE       endPosition > 0
    )
INSERT INTO @Products
SELECT  SUBSTRING(@Remarks,startPostion, COALESCE(NULLIF(endPosition,0),LEN(@Remarks) + 1) - startPostion) AS [Data]
FROM Split_CTE

SELECT SUBSTRING([Product], CHARINDEX('~', [Product]) + 1, LEN([Product])) AS Id
,SUBSTRING([Product], 0, CHARINDEX('~', [Product])) AS Product
FROM @Products

0

Существует также способ сделать это с помощью XML, который может показаться вам интересным:

DECLARE @Remarks varchar(100) = 'Product1~2,Product2~1'

-- set up some variables for customizing the delimiters and parsing into XML
DECLARE @xml as xml
    ,@str as varchar(100)
    ,@str2 as varchar(100)
    ,@delimiter as varchar(10)
    ,@delimiter2 as varchar(10)

-- initialize using the values you provided
SET @delimiter ='~'
SET @delimiter2 =','
SET @str = @Remarks

-- convert your string to XML
SET @str2 = ('<val>'+replace(@str,@delimiter ,'</val><qty>')+'</qty>')
SET @xml = cast(('<rec>'+replace(@str2,@delimiter2 ,'</qty></rec><rec><val>')+'</rec>') as xml)

-- SQL using XQuery
SELECT 
  ref.value('val[1]', 'varchar(10)') AS value,
  ref.value('qty[1]', 'varchar(10)') AS quantity
FROM @xml.nodes('/rec') 
xmlData( ref )

И результат:

value      quantity
---------- ----------
Product1   2
Product2   1

(2 row(s) affected)
SQL, SQL-сервер,
Похожие вопросы