答案 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
要对表中的值执行此操作,只需将CROSS APPLY
STRING_SPLIT
到CTE
内的表中即可。例如,如果在名为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
答案 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);