SQL where子句中的字符串函数

时间:2012-05-01 18:44:20

标签: sql-server

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

我用简单的英语术语表达的条件是: 条形码1与条形码2相同,但在数字7,8中,对于条形码2,数字7和8在条形码1中是相同的,加20

所以

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

我还希望否定where子句,其中返回与条件不匹配的行。

谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你必须使用字符串操作来破坏条形码,例如:

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

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