在SQL Server中基于两个定界符分割单个值

时间:2019-02-14 07:09:03

标签: sql sql-server

我有一个字符串'100029 | 0.00,120035 | 0.00,120083 | 0.00'。 我需要将其拆分两次 首先,我基于逗号将其分离并保存在表中。 然后我想基于'|'进行拆分再次签名。不明白我该怎么做。 我不想使用While循环。 我的代码

DECLARE @tab TABLE (appinv VARCHAR(200))
DECLARE @tab1 TABLE (app VARCHAR(200), inv varchar(200))

INSERT INTO @tab
select Data from dbo.SplitString('100029|0.00,120035|0.00,120083|0.00',',')
select appinv from @tab 

我想要的输出是

INSERT INTO @tab1 VALUES('100029',0.00),('120035',0.00),('120083',0.00)
select * from @tab1

请帮助

2 个答案:

答案 0 :(得分:3)

您可以尝试以下查询。

   DECLARE @tab TABLE (app VARCHAR(200), inv varchar(200))
    INSERT INTO @tab
    SELECT SUBSTRING(Data,0,PATINDEX('%|%',Data)), 
    SUBSTRING(Data,PATINDEX('%|%',Data)+1,len(Data)) from 
   dbo.SplitString('100029|0.00,120035|0.00,120083|0.00',',')
   SELECT * FROM @tab

答案 1 :(得分:1)

如果您想使用现有的dbo.SplitString函数,在这种情况下,您可以尝试执行以下操作。

INSERT INTO @tab1 
SELECT LEFT(data, Charindex('|', data) - 1)           AS LeftPart, 
       RIGHT(data, Charindex('|', Reverse(data)) - 1) AS RightPart 
FROM   (SELECT data 
        FROM   dbo.Splitstring('100029|0.00,120035|0.00,120083|0.00', ','))T 

也可以像没有SplitString函数的情况那样进行操作。

DECLARE @tab1 TABLE 
  ( 
     app VARCHAR(200), 
     inv VARCHAR(200) 
  ) 
DECLARE @xml AS XML, 
        @str AS VARCHAR(100) 

SET @str='100029|0.00,120035|0.00,120083|0.00' 
SET @xml = Cast(( '<X>' + Replace(@str, ',', '</X><X>') + '</X>' ) AS XML) 

INSERT INTO @tab1 
SELECT LEFT(value, Charindex('|', value) - 1)           AS LeftPart, 
       RIGHT(value, Charindex('|', Reverse(value)) - 1) AS RightPart 
FROM   (SELECT n.value('.', 'varchar(100)') AS value 
        FROM   @xml.nodes('X') AS T(n))T 

SELECT * 
FROM   @tab1 

输出

+--------+------+
| app    | inv  |
+--------+------+
| 100029 | 0.00 |
+--------+------+
| 120035 | 0.00 |
+--------+------+
| 120083 | 0.00 |
+--------+------+