0

次のクエリはやや奇妙な動作をしています。

SELECT #batches.OutTo, PO_Number, CONVERT(varbinary, #batches.OutTo) , convert     (varbinary, PO_Number), 
    CASE WHEN convert(varbinary, #batches.OutTo) NOT IN (SELECT convert(varbinary,    PO_Number) FROM #pos) 
         THEN 'NOT IN' ELSE 'IN' END
FROM #batches LEFT JOIN #pos ON 
    convert(varbinary, #batches.OutTo) = CONVERT(varbinary, PO_Number)
WHERE #batches.OutTo IS NOT NULL
GROUP BY #batches.OutTo, #pos.PO_Number


OutTo       PO_Number   (No column name)    (No column name)    (No column name)
311117      NULL        0x333131313137      NULL                    IN
311130      311130      0x333131313330      0x333131313330          IN
311259      NULL        0x333131323539      NULL                    IN
L001934     L001934     0x4C303031393334    0x4C303031393334        IN
L001988     NULL        0x4C303031393838    NULL                    IN
L002002     NULL        0x4C303032303032    NULL                    IN

ご覧のとおり、左側の結合は正しく動作しますが、NOT INは動作せず、NOTINである必要がある値に対してINを返します。どうしてこれなの?それはバグなのか、それとも私が知らないSQLの機能なのか?

4

2 に答える 2

3

これを試してください(サブクエリは必要ありません):

SELECT #batches.OutTo, PO_Number, CONVERT(varbinary(35), #batches.OutTo) , 
    convert     (varbinary(35), PO_Number), 
    CASE WHEN convert(varbinary(35), PO_Number) IS NULL THEN 'NOT IN' 
         ELSE 'IN' END

FROM #batches 
LEFT JOIN #pos ON 
    convert(varbinary(35), #batches.OutTo) = CONVERT(varbinary(35), PO_Number)
WHERE #batches.OutTo IS NOT NULL
GROUP BY #batches.OutTo, #pos.PO_Number
于 2012-11-05T01:46:37.490 に答える
1

SELECT convert(varbinary, PO_Number) FROM #posフィルター条件なしでサブクエリを使用しています。これにより、値が追加INされ、リストに値が存在する可能性があるため、値が返されると思います。

この問題を解決するには、サブクエリにも適切な where 句を追加する必要があると思います。

   SELECT convert(varbinary,    PO_Number) FROM #pos 
                          WHERE #batches.OutTo IS NOT NULL
于 2012-11-05T01:44:50.140 に答える