Una din tainele lui DISTINCT

Ghinion (pentru unii :P ), post-ul acesta este strict de tehnologie. Mai exact SQL Server (Microsoft).

Am descoperit o chestie interesanta (100% scrie in documentatie dar eu nu o citisem) :

(Exemplu simplificat puternic) Sa zicem ca ai o tabela  T cu o coloana A de tip INT si datele tabelei sunt :

A
_________
0
1
2
NULL

Ei bine atunci SELECT DISTINCT A FROM T va returna

0
1
2
NULL

Dar! SELECT COUNT(DISTINCT A) FROM T va returna 3 (nu 4 cum s-ar astepta unii dintre noi).

Se pare ca e foarte privilegiata aceasta valoare numita NULL. O sa verific probabil maine la serviciu cum merg lucrurile in PL/SQL (Oracle) insa tare cred ca e la fel.

2 Răspunsuri la “Una din tainele lui DISTINCT”

  1. joule Says:

    Nu trebuie sa te mire experimentul de mai sus deoarece valorile de tip NULL nu se pot agrega (COUNT, SUM, AVG etc) – este standard ANSI SQL.

    PS: Este valabil si pt SELECT COUNT(A) FROM T, dar nu si pt SELECT COUNT(*) FROM T deoarece comanda din urma numara randuri, nu numarul de valori ale unei coloane.

  2. Siderite Says:

    COUNT intotdeauna numara valorile nenule, cam ca toate operatiunile de agregare. De aia cind faci o numarare a elementelor a care au corespondenta in b faci select count(b.id) from a left outer join b on a.id=b.id (ma rog, asta e un exemplu timpit, ca ar merge cu inner join, dar poate veri si suma tuturor elementelor din a in acelasi query).

    Intotdeauna am asociat COUNT cu SUM(CASE WHEN x IS NOT NULL THEN 1 END).


Lasă un Răspuns