【问题标题】:Resolve split string in subquery解决子查询中的拆分字符串
【发布时间】:2019-12-19 18:03:30
【问题描述】:

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

表 1

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 端。

【问题讨论】:

  • 永远不要将数据存储为逗号分隔的项目。只会给你带来很多麻烦。
  • 此外,字符串操作是高度特定于供应商的。我们需要知道您正在使用的 rdbms 和版本,才有机会回答这个问题。
  • @jarlh 我当然永远不会这样做,但这是一个现有的数据库;)相信我,我可以对制作这个的人大喊大叫.. :(
  • @a_horse_with_no_name 这是 Microsoft SQL,抱歉...
  • 哪个版本?较新的版本有一个 split() 功能会很有帮助

标签: sql sql-server tsql split


【解决方案1】:

在最新版本的 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;

也就是说,修复数据模型应该优先于尝试使用它。

【讨论】:

  • 这行得通,但它可能会产生错误的顺序,但是.. string_split 不会保持原始项目的顺序。
  • @Gordon Linoff,这行得通,非常感谢!它实际上将用于将所有现有数据从旧数据库传输到全新的规范化数据库,当然我们不再将任何数组放在单个单元格中:) 非常感谢大家的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多