go backarticles

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


Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.


Comments

user-gravatar

On 14 Jun 2020 @ 1:17 PM Nick Stavrou wrote:

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

user-gravatar

On 14 Jun 2020 @ 1:41 PM Antonios Chatzipavlis wrote:

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

user-gravatar

On 21 Jul 2020 @ 10:59 AM Dimosthenis Schizas wrote:

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

user-gravatar

On 21 Jul 2020 @ 11:07 AM Antonios Chatzipavlis wrote:

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

Leave your comment

COMMENT

FULL NAME

EMAIL ADDRESS

We use Gravatar

WEB SITE



captcha


 

Newsletter

If you want to receive updates from us subscribe below with your email.
Follow us in
PASS chapter logo

The Official PASS Local Group for Greece

About us Contact us Terms of Use Privacy Sing in Register
sql school greece logo
© 2010-2020 All rights reserved

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