如何使用字符串拆分进行不可能的连接

目录

不可能的连接

不可能的连接方法

STRING_SPLIT()的工作原理

将STRING_SPLIT()与INNER JOIN一起使用

结论


在本文中,我将向您展示如何使用STRING_SPLIT()来连接两个表。

在本文中,我将向您展示如何使用STRING_SPLIT()连接两个表。我称之为不可能的连接。

我已经多次遇到这种情况,并且总是在处理从两个不同来源导入的数据时。在大多数情况下,它与用户输入数据不一致有关。

不可能的连接

在此示例中,我有两个表,ProjectProjectStatus。我想连接ProjectStatusProject以在相同的结果中显示NameProjectStatusAccountNumber

如果你看ProjectStatusProjectName是程序员的梦想。代码看起来很棒。另一方面,Project表一团糟。代码隐藏在列值中。

没有办法直接从一个连接到另一个。事实上,只有Project 9108成功连接。

不可能的连接方法

我们使不可能的连接起作用的方法是将ProjectName分成几部分。这样,我们不必连接F1432 plastic,但可以查看连接F1432plastic部分。

从示例中可以看出,F1432是商品ProjectName的一部分,很容易在两个表之间连接。

主要步骤是:

  1. 将热混乱的列分成几块。
  2. 连接这个单独的部分以进行匹配。
  3. 如果匹配,则将两个表连接在一起。

所以现在我们知道这是如何发生的,让我们让它发生。为此,我们将首先了解STRING_SPLIT()

STRING_SPLIT()的工作原理

STRING_SPLIT()用于将列拆分为单独的部分。它是一种特殊类型的函数,它返回一个表作为其结果。它类似于表值函数

您可以在我写的这篇文章中了解更多信息STRING_SPLIT(),但总体思路是它采用您要拆分的列和字符,例如分隔值(也称为单词)的空格。

所以STRING_SPLIT(‘F1432 plastic’, ‘ ‘)返回一个有两行的表:

  • F1432
  • Plastic

在我们的示例中,让我们看看在查询Project中使用字符串拆分时会发生什么:

这是带有帐号的标记化表:

select value ProjectName, AccountNumber
from Project
    cross apply string_split(ProjectName, ' ')

这里有几件事需要注意。首先,由于STRING_SPLIT()返回一个表,我们可以在查询中使用它。你会看到我正在使用CROSS APPLYSTRING_SPLIT()结果连接到Project。我这样做可以返回一个结果,显示每个ProjectName值旁边的AccountNumber

我们现在在最终连接ProjectStatus表中使用这个结果来获得我们的最终结果。

STRING_SPLIT()INNER JOIN一起使用

至此,困难的部分已经结束。我们有一个中间结果,其中包括项目代码以及帐号。

最后要做的是将其与Project表格相关联。

在以下示例中,我将所有这些放在一起:

Select s.ProjectName, s.ProjectStatus, p.AccountNumber
from ProjectStatus s
    left join (
        select value ProjectName, AccountNumber
        from Project cross apply string_split(ProjectName, ' ')
    ) p on s.ProjectName = p.ProjectName

结论

如果您发现自己需要连接嵌入在另一个字符串中的代码,那么您可能会发现STRING_SPLIT()允许您访问代码以使连接成功。

本文最初发布于How to do an Impossible Join with String Split - Essential SQL

https://www.codeproject.com/Articles/5326621/How-to-do-an-Impossible-Join-with-String-Split

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值