63

サポートされていない Microsoft SQL Server 2008R2 などの SQL 実装で、標準のIS DISTINCT FROMand演算子を含む式をどのように書き換えますか?IS NOT DISTINCT FROM

4

9 に答える 9

12

SQL 実装が SQL 標準IS DISTINCT FROMおよびIS NOT DISTINCT FROM演算子を実装していない場合は、次の等価物を使用してそれらを含む式を書き換えることができます。

一般に:

a IS DISTINCT FROM b <==>
(
    ((a) IS NULL AND (b) IS NOT NULL)
OR
    ((a) IS NOT NULL AND (b) IS NULL)
OR
    ((a) <> (b))
)

a IS NOT DISTINCT FROM b <==>
(
    ((a) IS NULL AND (b) IS NULL)
OR
    ((a) = (b))
)

UNKNOWN と FALSE の違いが重要なコンテキストで使用する場合、この回答は正しくありません。珍しいと思いますけどね。@ChrisBandy によって受け入れられた回答を参照してください。

データに実際には存在しないプレースホルダー値を特定できる場合COALESCEは、次の代替手段があります。

a IS DISTINCT FROM b <==> COALESCE(a, placeholder) <> COALESCE(b, placeholder)
a IS NOT DISTINCT FROM b <==> COALESCE(a, placeholder) = COALESCE(b, placeholder)
于 2012-05-02T15:25:22.080 に答える
7

IS DISTINCT FROM と IS NOT DISTINCT FROM を書き直す際の注意点は、少なくとも SQL Server を使用している場合は、インデックスの使用に干渉しないことです。つまり、以下を使用する場合:

WHERE COALESCE(@input, x) = COALESCE(column, x)

SQL Server は、 columnを含むインデックスを使用できません。したがって、WHERE 句では、次の形式を使用することをお勧めします。

WHERE @input = column OR (@input IS NULL AND column IS NULL)

columnの任意のインデックスを利用します。(括弧はわかりやすくするためにのみ使用)

于 2013-05-24T19:30:26.907 に答える
1
a IS NOT DISTINCT FROM b

次のように書き換えることができます。

(a IS NOT NULL AND b IS NOT NULL AND a=b) OR (a IS NULL AND b is NULL)

a IS DISTINCT FROM b

次のように書き換えることができます。

NOT (a IS NOT DISTINCT FROM b)
于 2014-08-12T10:22:12.593 に答える