0

フィールドがあるとしましょう。それをBarcode1と呼びましょう。現在、すべてのBarcodes1は22文字で、各文字は整数です。2番目のフィールドBarcode2があるとします。これらは両方ともvarchar(22)

平易な英語での私の条件は次のとおりです。Barcode1は、7、8の数字を除いて、barcode2と同じです。ここで、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 に答える