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

Získání upozornění:Hodnota Null je odstraněna agregací nebo jinou operací SET

Většinou byste s tím neměli nic dělat.

  • Upozornění je možné deaktivovat nastavením ansi_warnings vypnuto, ale to má jiné účinky, např. o tom, jak se zachází s dělením nulou a může způsobit selhání, když vaše dotazy používají funkce, jako jsou indexovaná zobrazení, počítané sloupce nebo metody XML.
  • V některých omezených případech můžete agregát přepsat, abyste tomu zabránili. např. COUNT(nullable_column) lze přepsat jako SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) ale to není vždy možné udělat přímo bez změny sémantiky.

Je to pouze informační zpráva vyžadovaná standardem SQL. Kromě přidání nežádoucího šumu do streamu zpráv to nemá žádné škodlivé účinky (kromě toho, že SQL Server nemůže jen obejít čtení NULL řádky, které mohou mít režii, ale deaktivace varování neposkytuje v tomto ohledu lepší plány provádění)

Důvodem pro vrácení této zprávy je, že ve většině operací v SQL se množí hodnoty null.

SELECT NULL + 3 + 7 vrátí NULL (pokud jde o NULL jako neznámá veličina to dává smysl jako ? + 3 + 7 je také neznámý)

ale

SELECT SUM(N)
FROM   (VALUES (NULL),
               (3),
               (7)) V(N) 

Vrátí 10 a varování, že hodnoty null byly ignorovány.

Toto je však přesně ta sémantika, kterou chcete pro typické agregační dotazy. Jinak přítomnost jediného NULL znamenalo by to, že agregace v tomto sloupci ve všech řádcích by vždy vedly k NULL což není příliš užitečné.

Který je níže nejtěžší dort? (Zdroj obrázku, obrázek Creative Commons pozměněný (oříznutý a opatřený poznámkami) mnou)

Po zvážení třetího dortu se váhy rozbily, takže o čtvrtém dortu nejsou k dispozici žádné informace, ale přesto bylo možné změřit obvod.

+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
|      1 | 50     | 12.0          |
|      2 | 80     | 14.2          |
|      3 | 70     | 13.7          |
|      4 | NULL   | 13.4          |
+--------+--------+---------------+

Dotaz

SELECT MAX(Weight)        AS MaxWeight,
       AVG(Circumference) AS AvgCircumference
FROM   Cakes 

Vrátí

+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|        80 |          13.325  |
+-----------+------------------+

i když technicky není možné s jistotou říci, že 80 byla hmotnost nejtěžšího koláče (protože neznámé číslo může být větší), výsledky výše jsou obecně užitečnější než prosté vrácení neznámého.

+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|         ? |          13.325  |
+-----------+------------------+

Je tedy pravděpodobné, že chcete, aby byly hodnoty NULL ignorovány, a varování vás pouze upozorní na skutečnost, že se to děje.



  1. SELECT COUNT(*) AS count - Jak používat tento počet

  2. 3 způsoby, jak vrátit časové pásmo z hodnoty Datetime v Oracle

  3. Kolekce PL/SQL:Vnořená tabulka v databázi Oracle

  4. Jak zjistit, zda je vypočítaný sloupec deterministický na serveru SQL Server