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

Jak funguje NULLIF() na serveru SQL Server

V SQL Server, NULLIF() výraz kontroluje hodnotu dvou zadaných výrazů. Pokud jsou stejné, vrátí hodnotu null, jinak vrátí první výraz.

Syntaxe

Syntaxe vypadá takto:

NULLIF ( expression , expression )

Příklad

Zde je příklad k demonstraci:

SELECT NULLIF(3, 3);

Výsledek:

NULL

Zde jsou oba výrazy stejné, takže výsledkem je nulová hodnota.

Zde je to, co se stane, když si výrazy nejsou rovny:

SELECT NULLIF(3, 7);

Výsledek:

3

Tentokrát je vrácena první hodnota.

Zde je příklad, který shrnuje oba výsledky:

SELECT 
    NULLIF(0, 0) AS a,
    NULLIF(3, 3) AS b,
    NULLIF(3, 0) AS c,
    NULLIF(0, 3) AS d;

Výsledek:

+------+------+-----+-----+
| a    | b    | c   | d   |
|------+------+-----+-----|
| NULL | NULL | 3   | 0   |
+------+------+-----+-----+

Praktický příklad

Předpokládejme, že máme tabulku s následujícími údaji:

SELECT 
    ProductName,
    ProductPrice
FROM Products;

Výsledek:

+-------------------------------------+----------------+
| ProductName                         | ProductPrice   |
|-------------------------------------+----------------|
| Left handed screwdriver             | 25.99          |
| Long Weight (blue)                  | 14.75          |
| Long Weight (green)                 | 11.99          |
| Smash 2000 Sledgehammer             | 0.00           |
| Chainsaw (includes 3 spare fingers) | 0.00           |
| Straw Dog Box                       | NULL           |
| Bottomless Coffee Mugs (4 Pack)     | 9.99           |
| Right handed screwdriver            | 25.99          |
+-------------------------------------+----------------+
(8 rows affected)

A předpokládejme, že chceme zjistit, kolik produktů má kladnou cenu. Jinými slovy, nechceme zahrnout produkty, které mají cenu, nulovou nebo nulovou hodnotu.

K tomu můžeme použít NULLIF() ve spojení s COUNT() funkce:

SELECT 
    COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;

Výsledek:

+----------+
| Result   |
|----------|
| 5        |
+----------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Dostaneme 5 podle očekávání, což je přesně to, kolik řádků má kladnou hodnotu v ProductPrice sloupec.

Funguje to, protože COUNT() funkce počítá pouze nenulové hodnoty. Převedením nulových částek na null jsme schopni tyto hodnoty v našem výpočtu ignorovat.

Zde je opět bez NULLIF() funkce.

SELECT COUNT(ProductPrice) AS Result
FROM Products;

Výsledek:

+----------+
| Result   |
|----------|
| 7        |
+----------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Tentokrát zahrnuje nulové částky a dostaneme 7. Stále ignoruje řádek 6, protože má ve skutečnosti nulovou hodnotu.

Když je prvním argumentem nulová konstanta

Funkce nepřijímá konstantu null jako svůj první argument:

SELECT NULLIF(null, 3);

Výsledek:

Msg 4151, Level 16, State 1, Line 1
The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.

Jak uvádí chybová zpráva, musí být znám typ prvního argumentu. Návratová hodnota funkce používá datový typ prvního výrazu a tato chyba to odráží.

Tato chyba by měla být poměrně vzácná. Ve většině případů předáte jako první argument název sloupce a na serveru SQL Server mají sloupce definovaný datový typ. V takových případech bude ve skutečnosti přijata hodnota null, protože SQL Server zná datový typ sloupce.

Totéž lze říci o proměnných. Pokud předáte proměnnou, museli byste deklarovat její typ, a proto byste nedostali chybu.

Neplatný počet argumentů

Volání funkce bez předání jakýchkoli argumentů má za následek chybu:

SELECT NULLIF();

Výsledek:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ')'.

A předání příliš mnoha argumentů také způsobí chybu:

SELECT NULLIF(1, 2, 3);

Výsledek:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ','.

  1. Jak spravovat MySQL - pro Oracle DBA

  2. Chyba MySQL 1064 syntaxe, ale vše se zdá být v pořádku

  3. Audit v Oracle

  4. Jako operátor v Entity Framework?