【问题标题】:Joining tables with a substring before a character在字符前使用子字符串连接表
【发布时间】:2020-01-30 10:07:17
【问题描述】:

我正在尝试加入表格。加入栏是合同号。我试图加入的表有多个合同号,每个合同号用逗号分隔(即Contract1,Contract2,Contract3)。

我尝试过使用LEFT CHARINDEXSUBSTRING CHARINDEX,但没有一个可以工作。

我尝试过的加入似乎不起作用:

SELECT *
FROM  tblA AS C WITH (NOLOCK)
INNER JOIN tblB AS tmp WITH(NOLOCK) 
      ON CONVERT(VARCHAR, c.Contract_No) = 
         CONVERT(VARCHAR, LEFT(tmp.ContractNo, CHARINDEX('-', tmp.ContractNo) - 1)) 

【问题讨论】:

  • 向我们展示一些示例表数据和预期结果 - 作为格式化文本,而不是图像。如果需要,请简化,minimal reproducible example
  • 永远不要将数据存储为逗号分隔值,这只会给您带来很多麻烦。

标签: sql sql-server string tsql join


【解决方案1】:

一种典型的方法是在 CSV 列表中搜索字符串是使用以下条件:

',' + tmp.ListOfContract_No + ',' like '%,' + c.Contract_No + ',%'

从您现有的查询中,不清楚哪一列包含合同编号列表,哪一列包含单一合同,因此我将这些列重命名为更健谈。我也认为不需要转换为 varchar - 就这两个列而言,它们应该已经是那种数据类型,它们包含像 'Contract1' 这样的值。

请注意,这种方法既低效又令人费解。您真的应该修复您的架构以将 CSV 列表的每个项目存储在单独的表行中。将 CSV 列表存储在关系数据库的列中是一种不好的做法,也是许多弊端的根源。更多关于 in this famous SO post 的信息(它与 MySQL 相关,但同样适用于 SQL Server)。

【讨论】:

    【解决方案2】:

    我想出的一种加入方式是

    SELECT *
    FROM  tblA AS C WITH (NOLOCK)
    INNER JOIN tblB AS tmp WITH(NOLOCK) 
          ON CONVERT(VARCHAR, c.Contract_No) = 
    SUBSTRING(tmp.ContractNo,0,CHARINDEX(',',tmp.ContractNo,0))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-13
      • 2012-04-05
      • 1970-01-01
      • 2020-06-17
      • 2013-11-14
      • 2022-06-17
      • 2015-09-18
      • 2017-04-24
      相关资源
      最近更新 更多