Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak przepisać IS DISTINCT FROM i IS NOT DISTINCT FROM?

IS DISTINCT FROM predykat został wprowadzony jako funkcja T151 SQL:1999 i jego czytelna negacja, IS NOT DISTINCT FROM , został dodany jako funkcja T152 SQL:2003. Celem tych predykatów jest zagwarantowanie, że wynik porównania dwóch wartości jest albo Prawda lub Fałsz , nigdy Nieznany .

Predykaty te działają z dowolnym porównywalnym typem (w tym wierszami, tablicami i zbiorami multisetów), co sprawia, że ​​ich dokładna emulacja jest dość skomplikowana. Jednak SQL Server nie obsługuje większości tych typów, więc możemy zajść dość daleko, sprawdzając puste argumenty/operandy:

  • a IS DISTINCT FROM b można przepisać 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 można przepisać jako:

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

Twoja własna odpowiedź jest nieprawidłowa, ponieważ nie uwzględnia, że ​​FALSE OR NULL ocenia jako Nieznany . Na przykład NULL IS DISTINCT FROM NULL powinien oceniać jako Fałsz . Podobnie, 1 IS NOT DISTINCT FROM NULL powinien oceniać jako Fałsz . W obu przypadkach Twoje wyrażenia dają Nieznane .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego CTE jest lepsze niż kursor / tabela pochodna / podzapytania / tabela tymczasowa itp.?

  2. Oblicz skrót MD5 ciągu UTF8

  3. SQL Server:Dołącz niepoprawną wersję 661

  4. Zmień typ kolumny z liczbami z varchar na int

  5. Wymień zapytania uruchomione na serwerze SQL