当尝试将列值拆分为文本单位和值单位时,它不适用于以逗号分隔的值?
when try to split column value to text units and value unit it not work on values have comma separated?
我使用 SQL Server 2012,我遇到了一个问题:我无法将 Value
列拆分为文本单元和值单元,以防我有一个 Value
包含多个以逗号分隔的值。
举个例子:
Value ValueUnit TextUnit
-----------------------------------------------------------------
1.71V, 2.375V, 3.135V 1.71 V, 2.375V, 3.135V
我在尝试将 Value
分成文本和值时遇到问题。
应该是这样的:
Value ValueUnit TextUnit
-----------------------------------------------------------------
1.71V, 2.375V, 3.135V 1.71,2.375,3.135 V
对于没有逗号的单个值如
Value TextUnit ValueUnit
--------------------------
1.8v V 1.8
效果很好。
示例数据如下:
create table #finaltable
(
Value nvarchar(50),
TextUnit nvarchar(50),
ValueUnit nvarchar(50)
)
insert into #finaltable (Value)
values ('1.71V, 2.375V, 3.135V'),
('1.89V, 2.625V, 3.465V'),
('1.8V')
update ft
set ValueUnit = substring(ft.Value, 1, ca.Posit),
TextUnit = substring (ft.Value, Posit + 1, 50)
from #FinalTable ft
cross apply (select PATINDEX('%[0-9.][^0-9.]%', ft.Value)) ca (Posit)
select *
from #finaltable
当你运行 上面的语句。它将在记录 1 和 2 上以逗号分隔显示问题,但在记录 3 上它完美地工作。
如何解决记录 1 和 2 的值以逗号分隔的问题?
预期结果必须如下
Value ValueUnit TextUnit
-------------------------------------------------------------
1.71V, 2.375V, 3.135V 1.71,2.375,3.135 V
1.89V, 2.625V, 3.465V 1.89,2.625,3.465 V
1.8V 1.8 V
错误的值如下,我不需要以下值:
Value TextUnit ValueUnit
------------------------------------------------------
1.71V, 2.375V, 3.135V V, 2.375V, 3.135V 1.71 --have issue on this line
1.89V, 2.625V, 3.465V V, 2.625V, 3.465V 1.89 --have issue on this line
首先,拆分值。然后,将数字与单位分开。然后将它们连接起来:
DROP TABLE IF EXISTS #finaltable;
create table #finaltable
(
Value nvarchar(50),
ValueXML XML,
TextUnit nvarchar(50),
ValueUnit nvarchar(50)
)
insert into #finaltable (Value)
values ('1.71V, 2.375V, 3.135V'),
('1.89V, 2.625V, 3.465V'),
('1.8V')
UPDATE #finaltable
SET [ValueXML] = '<a>' + REPLACE(Value, ',', '</a><a>') + '</a>';
WITH DataSource (Value, TextUnit, ValueUnit) AS
(
SELECT DS.Value
,substring(LTRIM(RTRIM(T.c.value('.', 'varchar(12)'))), 1, ca.Posit)
,substring (LTRIM(RTRIM(T.c.value('.', 'varchar(12)'))), Posit + 1, 50)
FROM #finaltable DS
CROSS APPLY DS.ValueXML.nodes('a') T(c)
CROSS APPLY (select PATINDEX('%[0-9.][^0-9.]%', LTRIM(RTRIM(T.c.value('.', 'varchar(12)'))))) ca (Posit)
)
SELECT DISTINCT DS1.[Value]
,DS.[Text]
,DS1.[ValueUnit]
FROM DataSource DS1
CROSS APPLY
(
SELECT STUFF
(
(
SELECT ',' + TextUnit
FROM DataSource DS2
WHERE DS2.[Value] = DS1.[Value]
ORDER BY TextUnit
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(1024)')
,1
,1
,''
)
) DS (Text);
我使用 SQL Server 2012,我遇到了一个问题:我无法将 Value
列拆分为文本单元和值单元,以防我有一个 Value
包含多个以逗号分隔的值。
举个例子:
Value ValueUnit TextUnit
-----------------------------------------------------------------
1.71V, 2.375V, 3.135V 1.71 V, 2.375V, 3.135V
我在尝试将 Value
分成文本和值时遇到问题。
应该是这样的:
Value ValueUnit TextUnit
-----------------------------------------------------------------
1.71V, 2.375V, 3.135V 1.71,2.375,3.135 V
对于没有逗号的单个值如
Value TextUnit ValueUnit
--------------------------
1.8v V 1.8
效果很好。
示例数据如下:
create table #finaltable
(
Value nvarchar(50),
TextUnit nvarchar(50),
ValueUnit nvarchar(50)
)
insert into #finaltable (Value)
values ('1.71V, 2.375V, 3.135V'),
('1.89V, 2.625V, 3.465V'),
('1.8V')
update ft
set ValueUnit = substring(ft.Value, 1, ca.Posit),
TextUnit = substring (ft.Value, Posit + 1, 50)
from #FinalTable ft
cross apply (select PATINDEX('%[0-9.][^0-9.]%', ft.Value)) ca (Posit)
select *
from #finaltable
当你运行 上面的语句。它将在记录 1 和 2 上以逗号分隔显示问题,但在记录 3 上它完美地工作。
如何解决记录 1 和 2 的值以逗号分隔的问题?
预期结果必须如下
Value ValueUnit TextUnit
-------------------------------------------------------------
1.71V, 2.375V, 3.135V 1.71,2.375,3.135 V
1.89V, 2.625V, 3.465V 1.89,2.625,3.465 V
1.8V 1.8 V
错误的值如下,我不需要以下值:
Value TextUnit ValueUnit
------------------------------------------------------
1.71V, 2.375V, 3.135V V, 2.375V, 3.135V 1.71 --have issue on this line
1.89V, 2.625V, 3.465V V, 2.625V, 3.465V 1.89 --have issue on this line
首先,拆分值。然后,将数字与单位分开。然后将它们连接起来:
DROP TABLE IF EXISTS #finaltable;
create table #finaltable
(
Value nvarchar(50),
ValueXML XML,
TextUnit nvarchar(50),
ValueUnit nvarchar(50)
)
insert into #finaltable (Value)
values ('1.71V, 2.375V, 3.135V'),
('1.89V, 2.625V, 3.465V'),
('1.8V')
UPDATE #finaltable
SET [ValueXML] = '<a>' + REPLACE(Value, ',', '</a><a>') + '</a>';
WITH DataSource (Value, TextUnit, ValueUnit) AS
(
SELECT DS.Value
,substring(LTRIM(RTRIM(T.c.value('.', 'varchar(12)'))), 1, ca.Posit)
,substring (LTRIM(RTRIM(T.c.value('.', 'varchar(12)'))), Posit + 1, 50)
FROM #finaltable DS
CROSS APPLY DS.ValueXML.nodes('a') T(c)
CROSS APPLY (select PATINDEX('%[0-9.][^0-9.]%', LTRIM(RTRIM(T.c.value('.', 'varchar(12)'))))) ca (Posit)
)
SELECT DISTINCT DS1.[Value]
,DS.[Text]
,DS1.[ValueUnit]
FROM DataSource DS1
CROSS APPLY
(
SELECT STUFF
(
(
SELECT ',' + TextUnit
FROM DataSource DS2
WHERE DS2.[Value] = DS1.[Value]
ORDER BY TextUnit
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(1024)')
,1
,1
,''
)
) DS (Text);