在SQL Server表中将一列拆分为多列,但某些无效值未对齐
我需要在SQL Server 2012 v11中将一列拆分为多列 我的数据:在SQL Server表中将一列拆分为多列,但某些无效值未对齐,sql,sql-server,Sql,Sql Server,我需要在SQL Server 2012 v11中将一列拆分为多列 我的数据: a_value ---------------------------------------------------------- (6, 5, 1908, 650) (16, 21, 3002, 110) (-228,117,29,335,279,700,000,000,000,000,000,000,000,000) (-387,150,276,186,008) NULL 大多数数据都有3个有效逗号
a_value
----------------------------------------------------------
(6, 5, 1908, 650)
(16, 21, 3002, 110)
(-228,117,29,335,279,700,000,000,000,000,000,000,000,000)
(-387,150,276,186,008)
NULL
大多数数据都有3个有效逗号,但其中一些无效。对于这些无效值,我想将它们作为字符串放到另一列中
我想:
w1 w2 w3 w4 w5
---------------------------------------------------------------------------------------
6 5 1908 650 NULL
16 21 3002 110 NULL
NULL NULL NULL NULL (-228,117,29,335,279,700,000,000,000,000,000,000,000,000)
NULL NULL NULL NULL (-387,150,276,186,008)
NULL NULL NULL NULL NULL
我的SQL查询:
SELECT
CASE
WHEN LEN(a_value) >= 9
THEN PARSENAME(REPLACE(substring(a_value, 1, LEN(a_value) -2), ',', '.'), 4)
ELSE NULL
END AS w1,
CASE
WHEN LEN(a_value) >= 9
THEN PARSENAME(REPLACE(substring(a_value, 1, LEN(a_value) -2), ',', '.'), 3)
ELSE NULL
END AS w2,
CASE
WHEN LEN(a_value) >= 9
THEN PARSENAME(REPLACE(substring(a_value, 1, LEN(a_value) -2), ',', '.'), 2)
ELSE NULL
END AS w3,
CASE
WHEN LEN(window_pos_size) >= 9
THEN PARSENAME(REPLACE(substring(a_value, 1, LEN(a_value) -2), ',', '.'), 1)
ELSE NULL
END AS w4
FROM
my_tbl
它不起作用
对SQL查询有什么建议吗 我想这就是你想要的逻辑:
select (case when a_value not like '%,%,%,%,%'
then PARSENAME(REPLACE(substring(a_value, 1, len(a_value) -2),',','.'),4)
end) as w1,
(case when a_value not like '%,%,%,%,%'
then PARSENAME(REPLACE(substring(a_value, 1, len(a_value) -2),',','.'),3)
end) as w2,
(case when a_value not like '%,%,%,%,%'
then PARSENAME(REPLACE(substring(a_value, 1, len(a_value) -2),',','.'),2)
end) as w3,
(case when a_value not like '%,%,%,%,%'
then PARSENAME(REPLACE(substring(a_value, 1, len(a_value) -2),',','.'),1)
end) as w4,
(case when a_value like '%,%,%,%,%'
then a_value
end) as w5
这将返回第四行的值,而您的示例数据不会返回该值。您没有描述任何过滤,因此我认为这是正确的
是一把小提琴。只是另一种选择
范例
返回
另一种可能的方法是计算逗号: 输入:
CREATE TABLE #Data (
a_value varchar(max)
)
INSERT INTO #Data
(a_value)
VALUES
('(6, 5, 1908, 650)'),
('(16, 21, 3002, 110)'),
('(-228,117,29,335,279,700,000,000,000,000,000,000,000,000)'),
('(-387,150,276,186,008)'),
(NULL)
T-SQL:
SELECT
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN PARSENAME(REPLACE(SUBSTRING(a_value, 2, LEN(a_value) -2), ',', '.'), 4)
ELSE NULL
END AS w1,
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN PARSENAME(REPLACE(SUBSTRING(a_value, 2, LEN(a_value) -2), ',', '.'), 3)
ELSE NULL
END AS w2,
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN PARSENAME(REPLACE(SUBSTRING(a_value, 2, LEN(a_value) -2), ',', '.'), 2)
ELSE NULL
END AS w3,
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN PARSENAME(REPLACE(SUBSTRING(a_value, 2, LEN(a_value) -2), ',', '.'), 1)
ELSE NULL
END AS w4,
CASE
WHEN LEN(a_value) - LEN(REPLACE(a_value, ',', '')) = 3
THEN NULL
ELSE a_value
END AS w5
FROM
#Data
输出:
----------------------------------------------------------------------------------------
w1 w2 w3 w4 w5
----------------------------------------------------------------------------------------
6 5 1908 650 NULL
16 21 3002 110 NULL
NULL NULL NULL NULL (-228,117,29,335,279,700,000,000,000,000,000,000,000,000)
NULL NULL NULL NULL (-387,150,276,186,008)
NULL NULL NULL NULL NULL
谢谢,有效行应为“%”、%、%、%,%”,3个逗号?@user3448011。我已经提供了一个数据库,说明查询是基于您在问题中提供的数据进行的。这四个逗号是故意的,因为比较器与之不同。我对dbfiddle做了一些更改,有些行可能是空的。但查询不起作用。谢谢
----------------------------------------------------------------------------------------
w1 w2 w3 w4 w5
----------------------------------------------------------------------------------------
6 5 1908 650 NULL
16 21 3002 110 NULL
NULL NULL NULL NULL (-228,117,29,335,279,700,000,000,000,000,000,000,000,000)
NULL NULL NULL NULL (-387,150,276,186,008)
NULL NULL NULL NULL NULL