【问题标题】:SQL find matches between two tables using likeSQL 使用 like 查找两个表之间的匹配项
【发布时间】:2014-07-03 11:03:47
【问题描述】:

我有两张桌子:

table 1 - ~230 000 行并包含产品序列号 table 2 - ~4700 行,还包含产品序列号,但格式略有不同

table 1 序列号类似于 123456 table 2 序列号类似于 ABC123456DGF

我需要找出表 1 中实际存在的表 2 中的序列号。我可以使用 LIKE 函数来做到这一点,但我很难弄清楚如何正确地将它循环到整个表中,以便每一行都得到对照表 2 进行测试。

有什么想法吗?

【问题讨论】:

  • 假设ABCDGF 是动态值,那么您如何在不使用LIKE 的情况下做到这一点
  • 你不能用like来做到这一点,因为'%12345%'也可以返回你'ABC12345678EFG'
  • 每种情况下的数字部分是否已知固定长度?
  • 您使用哪个数据库?从您的示例中仅包含数字的序列号和仅字母的前缀和后缀?
  • 最安全的方法是如果有一种方法可以将表 2 中的所有序列号转换为表 1 的格式 - 那么您不需要 LIKE 来比较它们。为此,有一些方法可以只返回表 2 中序列号的数字部分。

标签: sql sql-like


【解决方案1】:

也许这对你有帮助..

declare @var varchar(50)='ABC123456DGF'

SELECT LEFT(Val,PATINDEX('%[^0-9]%', Val+'a')-1) from(

    SELECT SUBSTRING(@var, PATINDEX('%[0-9]%', @var), LEN(@var)) Val
) x

select * from Table_1 where product_serial_numbers = @var

【讨论】:

    【解决方案2】:

    在这种情况下,我可能会修改table2中的序列号...

    SELECT Substr(serial_no,4,10) FROM Table 2
    

    然后加入table1

    SELECT T1.serial_no
    FROM table1 T1
    INNER JOIN (SELECT Substr(serial_no,4,10) as serial_no FROM Table2) T2
    ON T1.serial_no T2.serial_no
    

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多