【发布时间】:2018-02-02 08:42:30
【问题描述】:
以前有人问过Turning a Comma Separated string into individual rows。这对一个专栏很有用,但我有一个扩展问题。如果我想拆分两个(或更多)相关列怎么办。也就是说,如果我有这样的数据(使用上一篇文章中的数据作为基础):
| SomeID | OtherID | Data | RelatedData |
+----------------+-------------+-----------+-------------+
| abcdef-..... | cdef123-... | 18,20,22 | xxx,,yyy |
| abcdef-..... | 4554a24-... | 17,19 | a,bb |
| 987654-..... | 12324a2-... | 13,19,20 | r,s,t |
并且想要返回如下行:
| SomeID | OtherID | Data | RelatedData |
+----------------+-------------+------+-------------+
| abcdef-..... | cdef123-... | 18 | xxx |
| abcdef-..... | cdef123-... | 20 | |
| abcdef-..... | cdef123-... | 22 | yyy |
| abcdef-..... | 4554a24-... | 17 | a |
| abcdef-..... | 4554a24-... | 19 | bb |
| ... | ... | ... | ... |
由于其简单性,我希望使用 STRING_SPLIT,但我找不到使其工作的方法。这不起作用:
select OtherID, cs1.Value, cs2.Value
from yourtable
cross apply STRING_SPLIT (Data, ',') cs1
cross apply STRING_SPLIT (RelatedData, ',') cs2
有什么建议吗?
【问题讨论】:
-
ROW_NUMBER(),JOIN,然后是CROSS APPLY。 -
是时候重新设计数据库了——这才是真正的答案。
-
另外,如果不能说服人们规范化他们的数据,可以考虑 JSON。将相关数据存储在一起至少会大大简化这些问题。无论您如何切片,跨“相关”列都非常不方便。
-
我正在尝试将数据从一种非常奇怪的格式(具有多值字段的 Unidata)移动到规范化数据库中。过渡并不容易。
标签: sql-server sql-server-2016