0

可以说我有一个领域。让我们称之为 Barcode1。现在所有的 Barcodes1 都是 22 个字符,每个字符都是一个整数。假设有第二个字段 Barcode2。这两个都是varchar(22)

我的条件用简单的英文术语是:Bar​​code1 与barcode2 相同,但数字7,8 除外,对于barcode2,数字7 和8 与barcode1加20相同

所以

001214**54**54545654521523
549462**74**48634842135782

我也想要 where 子句的否定,其中返回不匹配条件的行。

谢谢你。

4

2 回答 2

1

我认为这就是你想要的:

示例数据:

DECLARE @table TABLE ( barcode VARCHAR(22) )
INSERT  INTO @table
        (
          barcode
        )
        SELECT  '0012145454545654521523'
        UNION ALL
        SELECT  '0012142454545654521523'
        UNION ALL
        SELECT  '5494627448634842135782'
        UNION ALL
        SELECT  '5494625448634842135782'

第一个条件 - 满足 7,8 + 20

SELECT  a.barcode,
        b.barcode,
        SUBSTRING(a.barcode, 7, 2) a,
        SUBSTRING(b.barcode, 7, 2) b
FROM    @table a
        INNER JOIN @table b
            ON SUBSTRING(a.barcode, 7, 2) + 20 = SUBSTRING(b.barcode, 7, 2)
               AND a.barcode != b.barcode

返回:

barcode                 barcode                  a  b
0012145454545654521523  5494627448634842135782  54  74
5494625448634842135782  5494627448634842135782  54  74

不存在 7,8 + 20 的否定

SELECT  *
FROM    @table a
WHERE   NOT EXISTS ( SELECT TOP 1 1
                     FROM   @table b
                     WHERE  SUBSTRING(a.barcode, 7, 2) + 20 = SUBSTRING(b.barcode, 7, 2) )

返回:

0012142454545654521523
5494627448634842135782
于 2012-05-01T18:54:47.940 回答
0

您必须使用字符串操作来分解该条形码,例如:

WHERE
    substring(barcode1, 0, 6) = substring(barcode2, 0, 6) AND
    substring(barcode1, 9, 2) = substring(barcode2, 0, 9) AND
    etc...

而且由于您将对函数结果进行这些比较,因此不会使用索引。如果这是一个频繁的操作,您最好将条形码字符串拆分为单独的字段,这样您就可以将各个块作为完全独立的可索引字段进行比较。

于 2012-05-01T18:48:30.350 回答