【问题标题】:Comparing Strings Containing Other Strings比较包含其他字符串的字符串
【发布时间】:2019-06-26 19:07:48
【问题描述】:

我正在比较两个表以匹配它们的地址行和邮政编码。但是,有时邮政编码(美国)的格式为 28272-0516,而在其他情况下只有 28272。无论短划线“-”后面的尾随如何,它们都应该正确匹配。

在 SQL Server 17 中,我使用 CharIndex 来定位破折号“-”但是遇到了问题,因为并非所有邮政编码都包含破折号。

你认为我需要一些 UNION 来获取表 a 中不包含破折号的所有邮政编码,然后是包含破折号的邮政编码,然后是包含破折号的表 b 等等。

SELECT *
from a
inner join b
on 
AND a.addressline1 = b.addressline1
AND LTRIM(TRIM(LEFT(a.PostalCode,CHARINDEX('-',a.PostalCode)-1))) = LTRIM(TRIM(LEFT(b.VendorPostalCode,CHARINDEX('-',b.VendorPostalCode)-1)))

【问题讨论】:

  • 为什么不简单地 left(ZipCode,5) = left(OtherZipCode,5)
  • 仅供参考 - 2017 允许 trim(...) 与 ltrim(rtrim(...))
  • 好主意让我试一试,我想多了
  • 发生在我们所有人身上:)
  • 嗨。请在代码问题中提供minimal reproducible example--cut & paste & runnable code;具有期望和实际输出的示例输入(包括逐字错误消息);标签和明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)

标签: sql sql-server join


【解决方案1】:

语法无效,试试:

SELECT *
from a
inner join b on  a.addressline1 = b.addressline1
AND  case when  a.PostalCode,CHARINDEX('-', a.PostalCode) <>0  then 
   LTRIM(TRIM(LEFT(a.PostalCode,CHARINDEX('-', a.PostalCode)-1))) = 
     LTRIM(TRIM(LEFT(b.VendorPostalCode,CHARINDEX('-', b.VendorPostalCode)-1)))
   else  a.PostalCode = b.VendorPostalCode 
   END 

【讨论】:

  • 感谢您指出我错过了删除“AND”,但它仍然不喜欢没有破折号的邮政编码,因此它不能解决问题。
  • 答案已更新 .. 邮政编码也没有破折号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
相关资源
最近更新 更多