在SQL Server表中将一列拆分为多列,但某些无效值未对齐

在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个有效逗号

我需要在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个有效逗号,但其中一些无效。对于这些无效值,我想将它们作为字符串放到另一列中

我想:

 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