sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Overview

Η χρήση των δεδομένων στην εποχή μας έχει οδηγήσει τους περισσότερους να μάθουν να γράφουν queries για να μπορούν να ικανοποιήσουν τις ανάγκες τους. Στις περισσότερες των περιπτώσεων αυτά τα queries κάνουν χρήση των βασικών στοιχείων που έχει η σύνταξη του statement. Αυτό πάντα όμως δεν είναι το ιδανικό.

Σε αυτό το άρθρο θα αναφερθώ στο NULLIF expression το οποίο αν χρησιμοποιηθεί κατάλληλα μπορεί να δώσει πολλαπλά κέρδη τόσο στην απλότητα του query όσο και στην απόδοση του.

NOTE
Aρκετοί το αναφέρουν σαν statement αλλά δεν είναι. Είναι expression. Όπως δεν είναι statement η CASE, είναι και αυτή expression.

NOTE
Υποστηρίζεται σε SQL Server, Azure SQL Database, Azure Synapse Analytics (SQL DW) και Parallel Data Warehouse.

Αν και η ύπαρξη του χάνεται στο παρελθόν, η χρήση του είναι ελάχιστη, καθώς αρκετοί δεν ξέρουν ότι υπάρχει και άλλοι δεν έχουν βρει ακόμα το πως μπορούν να το χρησιμοποιήσουν.

NULLIF expression

Το τι κάνει η NULLIF είναι απλό. Παίρνει δύο ορίσματα και ελέγχει αυτά αν είναι ίσα. Αν είναι, επιστρέφει null, αλλιώς επιστρέφει την τιμή του πρώτου ορίσματος.

Διαβάζοντας την παραπάνω παράγραφο είμαι σίγουρος ότι κάποιος θα πει:

Κάνει ότι κάνει η CASE ή IIF, άρα ποιος ο λόγος ύπαρξης της αφού αυτό που κάνει το κάνουμε ήδη με άλλους τρόπους;

Λογική ερώτηση εφόσον κάποιος δει απομονωμένα την χρήση της. Δυστυχώς, κατά την προσωπική μου άποψη, τα παραδείγματα που υπάρχουν στο documentation της δεν βοηθάνε στην κατανόηση της χρήσης της καθώς εστιάζονται στο βασικό συντακτικό της.

Αλλά για αυτό είμαστε εδώ για να δείξουμε πότε και πως μπορούμε να την εκμεταλλευτούμε, όπως πάντα με παράδειγμα.

NULLIF usage

Use case A

Έχω ένα Customers table που έχει 9Μ πελάτες και όπως συνήθως γίνεται υπάρχει το πεδίο της χώρας που o πελάτης είναι.

Θέλω να μετρήσω τους πελάτες που έχω, εκτός από αυτούς που είναι σε μια συγκεκριμένη χώρα. Αυτό εύκολα κάποιος μπορεί να το κάνει με το παρακάτω query

T-SQL Query

SELECT COUNT(*) AS ExceptGermany
FROM Sales.Customers
WHERE country <>'Germany'

Αν σε αυτό το query θελήσω να έχω και το συνολικό αριθμό των πελατών τότε τα πράγματα αλλάζουν καθώς ή θα πρέπει να κάνω χρήση variables ή να φτιάξω UDF ή να κάνω χρήση subquery όπως παρακάτω:

T-SQL Query

SELECT COUNT(*) AS AllCountries, 
(SELECT COUNT(*) FROM Sales.Customers WHERE country <>'Germany'AS ExceptGermany
FROM Sales.Customers

Σε αυτή την περίπτωση έχω ένα query που έχει duration 1387 ms και απασχόλησε την CPU 2766 ms (τα νούμερα είναι από το δικό μου lab) και το execution plan που o SentryOne Plan Explorer μου δείχνει είναι το παρακάτω:


Execution Plan
image

Αν όμως σκεφτώ το πως λειτουργούν τα aggregate functions όπως η COUNT, COUNT_BIG, AVG, MIN, MAX , SUM κ.α όπου αγνοούν τα null τότε η NULLIF είναι αυτή που μου χρειάζεται. Αντί να γράψω το παραπάνω query το γράφω με τον τρόπο παρακάτω:

T-SQL Query

SELECT COUNT(*) AS AllCountries, 
       COUNT(NULLIF(country,'Germany')) AS ExceptGermany
FROM Sales.Customers

Πλέον έχω ένα query με duration 915 ms, απασχόληση της CPU 1824 ms και το παρακάτω execution plan.


Execution Plan
image

Θεωρώ ότι είναι σαφώς καλύτερα τα πράγματα. Τι λέτε;

Use case B

Η NULLIF είναι ένα expression που μπορεί να συνδυαστεί και σε άλλες περιπτώσεις.

Για παράδειγμα στη παρακάτω χρήση της CASE

T-SQL Query

SELECT CASE WHEN @a=@b THEN NULL ELSE @a END;

Το οποίο μπορεί να γίνει

T-SQL Query

SELECT NULLIF (@a,@b) 

Use case C

Aκόμα και σε WHERE όπου ψάχνουμε να βρούμε σε ένα πεδίο τις γραμμές που σε αυτό είναι null αλλά διαπιστώνουμε ότι υπάρχουν και γραμμές με empty string οπότε γράφουμε κάτι σαν αυτό

T-SQL Query

SELECT * 
FROM T
WHERE col1 is null OR col1 = '';

Το οποίο με την χρήση της NULLIF μπορεί να γίνει

T-SQL Query

SELECT * 
FROM T
WHERE ΝULLIF(col1,'') is null ;

Conclusion

Είδαμε μερικά παραδείγματα για το πως μπορούμε να χρησιμοποιήσουμε τη NULLIF, υπάρχουν πολλά ακόμα. Αυτό που λέω πάντα είναι ότι χρησιμοποιούμε πάντα αυτό που έχει την καλύτερη απόδοση στην εκάστοτε περίπτωση.


//Antonios Chatzipavlis

Comments

14 Jun 2020 @ 1:17 PM

user-gravatar

Nick Stavrou

Είναι φοβερά χρήσιμα αυτά τα άρθρα σας!

14 Jun 2020 @ 1:41 PM

user-gravatar

Antonios Chatzipavlis

Ευχαριστώ πολύ.

21 Jul 2020 @ 10:59 AM

user-gravatar

Dimosthenis Schizas

Εξαιρετικά χρήσιμο και ειδικά το Use Case A & Use Case C που μου έχουν τύχει και τα έλυσα με τον πιο περιγραφικό τρόπο. Επειδή μπορεί να φανεί χρήσιμο για κάποιους να αναφέρω ότι υποστηρίζεται στην PostgreSQL και στη MySQL.

21 Jul 2020 @ 11:07 AM

user-gravatar

Antonios Chatzipavlis

Είναι ANSI command οπότε οι περισσότεροι την υποστηρίζουν

Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios Chatzipavlis is a highly experienced Data Solutions Consultant and Trainer. He has been working in the IT industry since 1988, holding various roles such as senior developer, IT Manager, Data & AI Solutions Architect and Consultant.

Since 1995, Antonios has focused on modern technologies and software development tools, primarily by Microsoft. He has specialized in Data & AI since 2000, with expertise in Microsoft Data Platform (SQL Server, Azure SQL Databases, Azure Synapse Analytics, Microsoft Fabric, Power BI, AI) and Databricks.

Antonios is also a Microsoft Certified Trainer (MCT) for over 25 years, has been recognized as a Microsoft Most Valuable Professional (MVP) in Data Platform since 2010 and he is in the Data Expert 40 Powerlist 2024 by Boussias. He is the co-founder and visionary behind XLYTiCA, a company dedicated to Data & AI solutions.

Episode

Task Flows in Microsoft Fabric

image

More Episodes...

Tip

Get Certified: Become a Fabric Data Engineer

More Tips...

Become a member

If you want to receive updates from us become a member to our community.

Connect

Explore

Learn

sqlschool.gr © 2010-2025 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.