sql >> Databáze >  >> RDS >> Sqlserver

Jak přepsat IS DISTINCT FROM a IS NOT DISTINCT FROM?

IS DISTINCT FROM predikát byl představen jako funkce T151 SQL:1999 a jeho čitelná negace IS NOT DISTINCT FROM , byl přidán jako funkce T152 SQL:2003. Účelem těchto predikátů je zaručit, že výsledek porovnání dvou hodnot je buď True nebo Nepravda , nikdy Neznámé .

Tyto predikáty fungují s jakýmkoli srovnatelným typem (včetně řádků, polí a multiset), takže je poměrně komplikované je přesně emulovat. SQL Server však většinu těchto typů nepodporuje, takže se můžeme dostat docela daleko kontrolou null argumentů/operandů:

  • a IS DISTINCT FROM b lze přepsat jako:

    ((a <> b OR a IS NULL OR b IS NULL) AND NOT (a IS NULL AND b IS NULL))
    
  • a IS NOT DISTINCT FROM b lze přepsat jako:

    (NOT (a <> b OR a IS NULL OR b IS NULL) OR (a IS NULL AND b IS NULL))
    

Vaše vlastní odpověď je nesprávná, protože nezohledňuje, že FALSE OR NULL vyhodnotí jako Neznámé . Například NULL IS DISTINCT FROM NULL by měl být vyhodnocen jako False . Podobně 1 IS NOT DISTINCT FROM NULL by měl být vyhodnocen jako False . V obou případech dávají vaše výrazy hodnotu Neznámé .



  1. Ukládání obrázku do databáze přímo nebo jako data base64?

  2. Jak nahradit NULL jinou hodnotou v SQL Server – ISNULL()

  3. Ekvivalent varchar(max) v MySQL?

  4. Hodnota sloupce identity náhle vyskočí na 1001 na serveru SQL