每个逗号分隔后,将数字字符串列拆分为多列

时间:2020-04-29 01:44:45

标签: sql sql-server tsql sql-server-2016

split the string in multiple columns in a table for multiple columns. like i got this output from string aggregation 我需要将其转换为三列,长度不是静态的,因为上述数字是根据计算得出的。

3 个答案:

答案 0 :(得分:1)

在SQL Server 2016中,您可以使用STRING_SPLIT拆分字符串(一旦删除周围的()),然后使用PIVOT将其拆分为列:< / p>

WITH CTE AS (
  SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
  FROM STRING_SPLIT(REPLACE(REPLACE('(0.0000, 3546.0000, 253422.000)', '(', ''), ')', ''), ',')
)
SELECT [1] AS Val1,
       [2] AS Val2,
       [3] AS Val3
FROM CTE
PIVOT (
  MAX(value)
  FOR rn IN ([1], [2], [3])
) p

输出:

Val1        Val2        Val3
0.0000      3546.0000   253422.000

Demo on dbfiddle

要对表中的值执行此操作,只需将CROSS APPLY STRING_SPLITCTE内的表中即可。例如,如果在名为exclusion的表中名为data的列:

WITH CTE AS (
  SELECT exclusion, value, ROW_NUMBER() OVER (PARTITION BY exclusion ORDER BY (SELECT NULL)) AS rn
  FROM data
  CROSS APPLY STRING_SPLIT(exclusion, ',')
)
SELECT exclusion,
       [1] AS Val1,
       [2] AS Val2,
       [3] AS Val3
FROM CTE
PIVOT (
  MAX(value)
  FOR rn IN ([1], [2], [3])
) p

Demo on dbfiddle

答案 1 :(得分:1)

根据文档STRING_SPLIT(),不能保证返回预期的排序顺序。

输出行 可以按任意顺序 。订单不保证 匹配输入字符串中子字符串的顺序。

在此处阅读:STRING_SPLIT() documentation

尝试这种JSON方法:

DECLARE @yourString NVARCHAR(100)=N'0.0000, 3546.0000, 253422.000';

-仅将数组作为派生表返回

SELECT *
FROM OPENJSON(CONCAT(N'[',@yourString,']'))

-通过使用WITH子句使用隐式透视(需要双括号)

SELECT *
FROM OPENJSON(CONCAT(N'[[',@yourString,']]'))
WITH (val1 FLOAT '$[0]'
     ,val2 FLOAT '$[1]'
     ,val3 FLOAT '$[2]')

更新

在这里,我使用您其他问题的样本。请-对于您的下一个问题-不要张贴图片。没有人想要输入值。

最好是DDL和INSERT,就像我在这里所做的一样:

-定义一个样机表以模拟您的问题并插入示例数据

DECLARE @tbl TABLE(ID INT,[TYPE] VARCHAR(100),prouctValues VARCHAR(100),subproValues VARCHAR(100),Amount VARCHAR(100));
INSERT INTO @tbl VALUES
 (23844,'12, 19','0.0000, 0.0000','0.0000, 0.0000','0.0000, 0.0000,37464.083')
,(25397,'1, 3,26','0.0000, 0.0000,2.345','0.0000,0.2345, 0.0000 ','25455.6800, 0.0000');

-查询

SELECT t.ID
      ,AllTypes.*
      ,AllPvals.* 
      ,AllSPvals.* 
      ,AllAmts.*
FROM @tbl t 
CROSS APPLY OPENJSON(CONCAT('[[',t.[TYPE],']]'))       WITH(t1      INT           '$[0]'
                                                           ,t2      INT           '$[1]'
                                                           ,t3      INT           '$[2]') AllTypes
CROSS APPLY OPENJSON(CONCAT('[[',t.prouctValues,']]')) WITH(pval_1  DECIMAL(10,4) '$[0]'
                                                           ,pval_2  DECIMAL(10,4) '$[1]'
                                                           ,pval_3  DECIMAL(10,4) '$[2]') AllPVals
CROSS APPLY OPENJSON(CONCAT('[[',t.subproValues,']]')) WITH(spval_1 DECIMAL(10,4) '$[0]'
                                                           ,spval_2 DECIMAL(10,4) '$[1]'
                                                           ,spval_3 DECIMAL(10,4) '$[2]') AllSPVals
CROSS APPLY OPENJSON(CONCAT('[[',t.Amount,']]'))       WITH(amt_1   DECIMAL(10,4) '$[0]'
                                                           ,amt_2   DECIMAL(10,4) '$[1]'
                                                           ,amt_3   DECIMAL(10,4) '$[2]') AllAmts;

结果

+-------+----+----+------+--------+--------+--------+---------+---------+---------+------------+--------+------------+
| ID    | t1 | t2 | t3   | pval_1 | pval_2 | pval_3 | spval_1 | spval_2 | spval_3 | amt_1      | amt_2  | amt_3      |
+-------+----+----+------+--------+--------+--------+---------+---------+---------+------------+--------+------------+
| 23844 | 12 | 19 | NULL | 0.0000 | 0.0000 | NULL   | 0.0000  | 0.0000  | NULL    | 0.0000     | 0.0000 | 37464.0830 |
+-------+----+----+------+--------+--------+--------+---------+---------+---------+------------+--------+------------+
| 25397 | 1  | 3  | 26   | 0.0000 | 0.0000 | 2.3450 | 0.0000  | 0.2345  | 0.0000  | 25455.6800 | 0.0000 | NULL       |
+-------+----+----+------+--------+--------+--------+---------+---------+---------+------------+--------+------------+

答案 2 :(得分:0)

在SQL Server中,字符串操作很麻烦。这是一种方法:

select replace(v1.el, '(', '') as column1, v2.el as column2,
       replace(v2.rest, ')', '') as column3
from t cross apply
     (values (left(t.derived, charindex(',', t.derived) - 1),
              stuff(t.derived, 1, charindex(',', t.derived), '')
             )
     ) v1(el, rest) cross apply
     (values (left(v.rest, charindex(',', v.rest) - 1),
              stuff(v.rest, 1, charindex(',', v.rest), '')
             )
     ) v2(el, rest);