-1

我有一列的值如下所示。我需要将值 10 与 SQL 服务器中的每一行分开(值 1 是字符串中的第一个,第二个在第一个逗号之后,依此类推)。

这是我的专栏:

Row 1    N,l,S,T,A,,<all>,,N,A,N,N,N,Y,Y,,Y,Y,Y,,AA,SA
Row 2    M,,A,S,AS,SS,AS,N,N,N,N,Y,Y,Y,ENTERPRISE,S,,A
Row 3    L,,A,D,S,A,A,AA,Y,Y,Y,YNN,N,N,N,N,A,AA,AD,D,D

我需要在表中使用 10 中的值(我可以丢弃字符串中的其余值)。如何在列中只获得一个值?我的表有 1000 多行,所以这只是一个例子,我需要一个可以将行中每个位置的值作为字符串源的代码。

结果如下:

Row 1    A
Row 2    N
Row 3    Y
4

1 回答 1

1

您可以先清除字符串中的任何特殊字符,例如出现包含在

< >。

清理字符串后,您应该对每个值进行一致分隔,然后可以将其呈现给 XML 函数,该函数将根据从左到右的数字位置将值与分隔字符串隔离。

DECLARE @TEST TABLE (STRING NVARCHAR(150));
INSERT INTO @TEST
VALUES 
('N,l,S,T,A,,<all>,,N,A,N,N,N,Y,Y,,Y,Y,Y,,AA,SA'),
('M,,A,S,AS,SS,AS,N,N,N,N,Y,Y,Y,ENTERPRISE,S,,A'),
('L,,A,D,S,A,A,AA,Y,Y,Y,YNN,N,N,N,N,A,AA,AD,D,D')

SELECT 
CONVERT(XML,'<x>'+REPLACE(REPLACE(REPLACE(STRING,'>',''),'<',''),',','</x><x>')+'</x>').value('/x[10]','NVARCHAR(150)') [VALUE 10],
STRING
FROM @TEST

这确实依赖于传递给函数的干净字符串,如果字符串没有清除特殊字符或始终被定界,则函数将失败。

VALUE 10    STRING
A           N,l,S,T,A,,<all>,,N,A,N,N,N,Y,Y,,Y,Y,Y,,AA,SA
N           M,,A,S,AS,SS,AS,N,N,N,N,Y,Y,Y,ENTERPRISE,S,,A
Y           L,,A,D,S,A,A,AA,Y,Y,Y,YNN,N,N,N,N,A,AA,AD,D,D

对于 Clarity,您可以像这样使用此函数:

SELECT
  CONVERT(XML,'<x>'+REPLACE(REPLACE(REPLACE(STRING,'>',''),'<',''),',','</x><x>')+'</x>').value('/x[10]','NVARCHAR(150)') [VALUE 10]
FROM YOURTABLE

只需将函数中的 STRING 替换为您的列名,就可以了。

于 2019-09-10T10:38:07.767 回答