解决子查询中分割字符串的问题

3

我在一个Microsoft SQL数据库中有两个表,其中一个包含3列分隔值(用逗号和/或斜杠分隔,但两者应该被等同地视为分隔符)。 然后我有另一个表,其中包含一个与TABLE1中每个拆分字符串项相同的ID。 我想解析TABLE1中的项,以便显示TABLE2中匹配行的文本。 有没有办法实现这个目标?

TABLE1

Text1           Text2           Text3
TA12,TA250      T1  
TA12,TA250      T1  
TA12,TA250      TA250,TA12      T310/T52
TA12,TA250      TA250           T310/T52

表格2

TA12            Hello
TA250           World
T1              This is a Test
T310            You are
T52             a Hero

期望结果

Text1           Text2           Text3
Hello World     This is a Test  NULL
Hello World     This is a Test  NULL
Hello World     World Hello     You are a Hero
Hello World     World           You are a Hero

我能使用C#实现这一点,但我非常希望这在SQL端发生。

6
永远不要将数据存储为逗号分隔的项目,这样做只会给你带来很多麻烦。 - jarlh
2
此外,字符串操作高度依赖于供应商。我们需要知道您正在使用的RDBMS和版本,才有可能回答这个问题。 - Zohar Peled
@jarlh 当然我绝对不会这样做,但这是一个现有的数据库;相信我,我可以对那些制作它的人大喊大叫.. :( - Tom
@a_horse_with_no_name 这是微软SQL,抱歉... - Tom
1
哪个版本?更新的版本有一个split()函数,这将非常有帮助。 - user330315
显示剩余5条评论
1个回答

2
在最新版本的SQL Server中,您可以执行以下操作:

使用以下代码:

select t.*, t1.new_text1, t2.new_text2, t3.new_text3
from table1 t outer apply
     (select string_agg(t2.col2) as new_text1
      from table2 t2
      where t2.col1 in (select * from string_split(replace(t.text1, '/', ','), ','))
     ) t1 outer apply
     (select string_agg(t2.col2) as new_text2
      from table2 t2
      where t2.col1 in (select * from string_split(replace(t.text2, '/', ','), ','))
     ) t2 outer apply
     (select string_agg(t2.col2) as new_text3
      from table2 t2
      where t2.col1 in (select * from string_split(replace(1.text3, '/', ','), ','))
     ) t3;

话虽如此,优先修复数据模型而不是试图使用它。


1
可以这样做,但是可能会导致结果顺序错误。string_split不保留原始项目的顺序。 - Zohar Peled
@Gordon Linoff,非常感谢您的帮助!这将用于将所有现有数据从旧数据库转移到全新的规范化数据库,我们肯定不再将任何数组放在单个单元格中 :) 非常感谢大家的帮助! - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接