让我说我有一个领域。让我们称之为Barcode1。现在所有条形码1都是22个字符,每个字符都是一个整数。
假设有第二个字段Barcode2。这两个都是varchar(22)
我用简单的英语术语表达的条件是:
条形码1与条形码2相同,但在数字7,8中,对于条形码2,数字7和8在条形码1中是相同的,加20
所以
001214**54**54545654521523
549462**74**48634842135782
我还希望否定where子句,其中返回与条件不匹配的行。
谢谢。
答案 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...
由于您将对函数结果进行这些比较,因此不会使用索引。如果这是一个频繁的操作,你最好将条形码字符串拆分成单独的字段,这样你就可以将各个字块比较为完全独立的可索引字段。