我有一个包含两列逗号分隔字符串的表格。根据数据格式,这两列中逗号分隔项的数量相等,colA 中的第一个值与 colB 中的第一个值相关联,以此类推。(显然,这不是一种非常好的数据格式,但这是我正在使用的格式。)
如果我有以下行(PrimaryKeyID | column1 | column2):
1 | a,b,c | A,B,C
那么在这种数据格式中,a&1、b&2等是逻辑相关的。
我想使用STRING_SPLIT
来拆分这些列,但显然使用两次会交叉它们,导致总共有9行。
1 | a | A
1 | b | A
1 | c | A
1 | a | B
1 | b | B
1 | c | B
1 | a | C
1 | b | C
1 | c | C
我想要的只是三个“逻辑相关”的列。
1 | a | A
1 | b | B
1 | c | C
然而,STRING_SPLIT(myCol,',')
似乎没有保存字符串位置。
我已经执行了以下操作:
SELECT tbl.ID,
t1.Column1Value,
t2.Column2Value
FROM myTable tbl
INNER JOIN (
SELECT t.ID,
ss.value AS Column1Value,
ROW_NUMBER() OVER (PARTITION BY t.ID ORDER BY t.ID) as StringOrder
FROM myTable t
CROSS APPLY STRING_SPLIT(t.column1,',') ss
) t1 ON tbl.ID = t1.ID
INNER JOIN (
SELECT t.ID,
ss.value AS Column2Value,
ROW_NUMBER() OVER (PARTITION BY t.ID ORDER BY t.ID) as StringOrder
FROM myTable t
CROSS APPLY STRING_SPLIT(t.column2,',') ss
) t1 ON tbl.ID = t2.ID AND t1.StringOrder = t2.StringOrder
这在我的小测试集上似乎有效,但我认为没有理由期望它每次都能保证有效。显然,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID)
是无意义的排序,但似乎在没有任何实际排序的情况下,STRING_SPLIT 返回的值是按照它们已经存在的“默认”顺序返回的。这是“预期”的行为吗?我可以依靠它吗?还有其他方法可以完成我尝试做的事情吗?谢谢。
======================
编辑
我使用以下 UDF 得到了我想要的东西(我想)。但是它非常慢。有什么建议吗?
CREATE FUNCTION fn.f_StringSplit(@string VARCHAR(MAX),@delimiter VARCHAR(1))
RETURNS @r TABLE
(
Position INT,
String VARCHAR(255)
)
AS
BEGIN
DECLARE @current_position INT
SET @current_position = 1
WHILE CHARINDEX(@delimiter,@string) > 0 BEGIN
INSERT INTO @r (Position,String) VALUES (@current_position, SUBSTRING(@string,1,CHARINDEX(@delimiter,@string) - 1))
SET @current_position = @current_position + 1
SET @string = SUBSTRING(@string,CHARINDEX(@delimiter,@string) + 1, LEN(@string) - CHARINDEX(@delimiter,@string))
END
--add the last one
INSERT INTO @r (Position, String) VALUES(@current_position,@string)
RETURN
END