当尝试将列值拆分为文本单位和值单位时,它不适用于以逗号分隔的值?

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);