CASE Statement & Nested Case στον SQL Server: Παράδειγμα T-SQL
Επισκόπηση της υπόθεσης στην πραγματική ζωή!
Και πάλι, στην πραγματική ζωή, εκτελούμε διαφορετικές ενέργειες ανάλογα με το αποτέλεσμα διαφορετικών συνθηκών.
Για περισσότερες λεπτομέρειες, λάβετε υπόψη το παρακάτω παράδειγμα:
- Εάν τα αεροπορικά εισιτήρια είναι λιγότερα από $100, τότε θα επισκεφτώ το Λος Άντζελες.
- Εάν τα αεροπορικά εισιτήρια είναι μεταξύ $100 και $200, τότε θα επισκεφτώ τη Νέα Υόρκη
- Εάν τα αεροπορικά εισιτήρια είναι μεταξύ $200 και $400, τότε θα επισκεφτώ την Ευρώπη
- Διαφορετικά, θα προτιμήσω να επισκεφτώ κάποιο κοντινό τουριστικό σημείο.
Ας εξετάσουμε την κατηγοριοποίηση της Συνθήκης και της Ενέργειας ξεχωριστά από το παραπάνω παράδειγμα παρακάτω:
| Συνθήκες - Αεροπορικά εισιτήρια | Ενέργειες που πραγματοποιήθηκαν, μόνο εάν η Κατάσταση είναι ΑΛΗΘΙΝΗ |
| Less από $ 100 | Επισκεφθείτε το Λος Άντζελες |
| Μεταξύ $ 100 και $ 200 | Επισκεφθείτε τη Νέα Υόρκη |
| Μεταξύ $ 200 και $ 400 | Επισκεφθείτε την Ευρώπη |
| Καμία από τις παραπάνω προϋποθέσεις δεν πληρούται | Κοντινό τουριστικό σημείο |
Στο παραπάνω παράδειγμα, μπορούμε να δούμε ότι το αποτέλεσμα των διαφορετικών συνθηκών διέπει ξεχωριστή ενέργεια. Π.χ., ο Επισκέπτης θα πραγματοποιήσει την πράξη της επίσκεψης στη Νέα Υόρκη μόνο υπό την προϋπόθεση ότι το αεροπορικό εισιτήριο είναι μεταξύ $100 και $200.
Ομοίως, η δήλωση MS SQL CASE παρέχει επίσης τη δυνατότητα να αναλάβουμε δράση για την εκτέλεση διαφορετικής δήλωσης T-SQL με βάση το αποτέλεσμα διαφορετικών συνθηκών.
Τι είναι η δήλωση CASE στον SQL Server;
Δήλωση CASE στον SQL Server είναι η επέκταση της δήλωσης IF…ELSE. Σε αντίθεση με το IF…ELSE, όπου επιτρέπεται μόνο το μέγιστο μιας συνθήκης, το CASE επιτρέπει στο χρήστη να εφαρμόσει πολλαπλές συνθήκες για να εκτελέσει διαφορετικά σύνολα ενεργειών στο MS SQL. Επιστρέφει μια αντίστοιχη τιμή που σχετίζεται με τη συνθήκη που έχει ορίσει ο χρήστης.
Ας μάθουμε πώς να χρησιμοποιείτε το Case σε SQL και την έννοια του στις παρακάτω ενότητες.
In MS SQL, υπάρχουν δύο τύποι CASE.
- Απλή ΠΕΡΙΠΤΩΣΗ
- Αναζητήθηκε CASE
Απλή ΠΕΡΙΠΤΩΣΗ
Η σύνταξη για την απλή υπόθεση
CASE <Case_Expression>
WHEN Value_1 THEN Statement_1
WHEN Value_2 THEN Statement_2
.
.
WHEN Value_N THEN Statement_N
[ELSE Statement_Else]
END AS [ALIAS_NAME]
Εδώ,
- Η παράμετρος Περίπτωση_Έκφραση υποδηλώνει την έκφραση με την οποία τελικά θα συγκριθούμε Τιμή_1, Τιμή_2, ...
- Οι παράμετροι Δήλωση_1, Δήλωση_2… υποδηλώνουν τις δηλώσεις που θα εκτελεστούν εάν Case_Expression = Value_1, Case_Expression = Τιμή_2, … και ούτω καθεξής.
- Με λίγα λόγια, το κατάσταση είναι εάν Case_Expression = Το Value_N και ACTION είναι η εκτέλεση της Statement_N εάν το το παραπάνω αποτέλεσμα είναι ΑΛΗΘΕΙΑ.
- ΨΕΥΔΩΝΥΜΟ είναι προαιρετικό και είναι το ψευδώνυμο που δίνεται στο αποτέλεσμα της δήλωσης CASE του SQL Server. Χρησιμοποιείται κυρίως όταν χρησιμοποιούμε ρήτρα επιλογής Case σε διακομιστή SQL.
Κανόνες για απλή υπόθεση
- Το Simple Case επιτρέπει μόνο έλεγχο ισότητας μεταξύ Case_Expression με Value_1 έως Value_N.
- Το Case_Expression συγκρίνεται με την τιμή, με τη σειρά που ξεκινά από την πρώτη τιμή, δηλαδή, Value_1. Παρακάτω είναι η προσέγγιση εκτέλεσης:
- Εάν το Case_Expression είναι ισοδύναμο με το Value_1, τότε παραλείπονται περαιτέρω προτάσεις WHEN…THEN και η εκτέλεση CASE θα ΤΕΛΕΙΩΣΕΙ αμέσως.
- Εάν το Case_Expression δεν ταιριάζει με το Value_1, τότε το Case_Expression συγκρίνεται με το Value_2 για ισοδυναμία. Αυτή η διαδικασία σύγκρισης Case_Expression με Τιμή θα συνεχιστεί έως ότου η Case_Expression βρει αντίστοιχη τιμή από το σύνολο Value_1, Value_2,…
- Εάν τίποτα δεν ταιριάζει, τότε ο έλεγχος πηγαίνει στη δήλωση ELSE και το Statement_Else θα εκτελεστεί.
- Το ΑΛΛΟ είναι προαιρετικό.
- Εάν το ELSE δεν υπάρχει και το Case_Expression ταιριάζει με καμία από τις τιμές, τότε Θα εμφανιστεί το Null.
Το παρακάτω διάγραμμα απεικονίζει τη ροή εκτέλεσης του Simple Case.

Παραδείγματα
Υπόθεση: Ας υποθέσουμε ότι έχουμε τον πίνακα ως »Guru99 " με δύο στήλες και τέσσερις σειρές όπως φαίνεται παρακάτω:
Θα το χρησιμοποιησουμε »Guru99 " πίνακα σε περαιτέρω παραδείγματα
Ερώτημα 1: ΑΠΛΗ ΠΕΡΙΠΤΩΣΗ με την επιλογή ΟΧΙ ΑΛΛΟ
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Αποτέλεσμα: Το παρακάτω διάγραμμα εξηγεί τη ροή εκτέλεσης μιας ΑΠΛΗς ΠΕΡΙΠΤΩΣΗΣ χωρίς ΑΛΛΟ.
Ερώτημα 2: ΑΠΛΗ ΠΕΡΙΠΤΩΣΗ με την επιλογή ΑΛΛΟ.
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Αποτέλεσμα: Το παρακάτω διάγραμμα εξηγεί τη ροή εκτέλεσης μιας SIMPLE CASE με το ELSE.
Αναζητήθηκε CASE
Η σύνταξη για την περίπτωση αναζήτησης
CASE
WHEN <Boolean_Expression_1> THEN Statement_1
WHEN <Boolean_Expression_2> THEN Statement_2
.
.
WHEN <Boolean_Expression_N> THEN Statement_N
[ELSE Statement_Else]
END AS [ALIAS_NAME]
Εδώ,
- Η παράμετρος Boolean_Expression_1, … υποδηλώνει την έκφραση που θα αξιολογηθεί ως TRUE ή FALSE.
- Οι παράμετροι Statement_1, Statement_2… υποδηλώνουν τις δηλώσεις που θα εκτελεστούν εάν το αντίστοιχο αποτέλεσμα Boolean_Expression_1, Boolean_Expression_2 είναι TRUE.
- Με λίγα λόγια, η συνθήκη είναι Boolean_Expression_1,… και η ACTION είναι η εκτέλεση της Statement_N εάν η παραπάνω boolean_Expression_1 είναι TRUE.
- Το ALIAS_NAME είναι προαιρετικό και είναι το ψευδώνυμο που δίνεται στο αποτέλεσμα της δήλωσης CASE. Χρησιμοποιείται κυρίως όταν χρησιμοποιούμε ΠΕΡΙΠΤΩΣΗ στην ρήτρα επιλογής.
Κανόνες για υποθέσεις που αναζητήθηκαν
- Σε αντίθεση με την απλή περίπτωση, το Searched Case δεν περιορίζεται μόνο στον έλεγχο ισότητας, αλλά επιτρέπει την έκφραση Boolean.
- Η έκφραση Boolean αξιολογείται, με τη σειρά που ξεκινά από την πρώτη Boolean έκφραση, δηλαδή, Boolean_expression_1. Παρακάτω είναι η προσέγγιση εκτέλεσης:
- Εάν η Boolean_expression_1 είναι TRUE, τότε παραλείπονται περαιτέρω προτάσεις WHEN…THEN και η εκτέλεση CASE θα ΤΕΛΕΙΩΣΕΙ αμέσως.
- Εάν η Boolean_expression_1 είναι FALSE, τότε η Boolean_expression_2 αξιολογείται ως TRUE συνθήκη. Αυτή η διαδικασία αξιολόγησης Boolean_expression θα συνεχιστεί έως ότου μία από τις Boolean_expression επιστρέψει TRUE.
- Εάν τίποτα δεν ταιριάζει, τότε ο έλεγχος πηγαίνει στη δήλωση ELSE και το Statement_Else θα εκτελεστεί.
- Το Like Simple Case ELSE είναι προαιρετικό και στην περίπτωση Αναζήτησης.
- Εάν το ELSE δεν υπάρχει και κανένα από τα Boolean_expression δεν επιστρέφει TRUE, τότε θα εμφανιστεί το Null.
Κάτω διάγραμμα επεξηγούν τη ροή εκτέλεσης του Αναζητημένη υπόθεση.
Παραδείγματα
Ερώτημα 1: ΑΝΑΖΗΤΗΣΗ ΠΕΡΙΠΤΩΣΗΣ με την επιλογή ΟΧΙ ΑΛΛΟ
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Αποτέλεσμα: Παρακάτω διάγραμμα εξηγεί τη ροή εκτέλεσης του ΑΝΑΖΗΤΗΣΗ ΥΠΟΘΕΣΗ μαζί σου, ΟΧΙ ΑΛΛΟ.
Ερώτημα 2: ΑΝΑΖΗΤΗΣΗ ΠΕΡΙΠΤΩΣΗΣ με ELSE επιλογή.
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Αποτέλεσμα: Παρακάτω διάγραμμα εξηγεί τη ροή εκτέλεσης of την ΑΝΑΖΗΤΩΜΕΝΗ ΥΠΟΘΕΣΗ μαζί σου, ΑΛΛΟΥ.
Διαφορά μεταξύ της προσέγγισης εκτέλεσης: SIMPLE και SEARCH CASE.
Ας ρίξουμε μια ματιά ΑΠΛΗ ΠΕΡΙΠΤΩΣΗ παράδειγμα παρακάτω:
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Εδώ, 'Tutorial_name' είναι μέρος της έκφρασης CASE στην SQL. Επειτα 'Tutorial_name' η τιμή συγκρίνεται με το καθένα ΟΤΑΝ αξίες, π.χ. 'SQL'… μέχρι το 'Tutorial_name' να ταιριάζει με τις τιμές WHEN.
Σε αντίθεση, ΥΠΟΘΕΣΗ ΑΝΑΖΗΤΗΣΗΣ το παράδειγμα δεν έχει Έκφραση ΠΕΡΙΠΤΩΣΗΣ:
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Εδώ, το καθένα δήλωση WHEN έχει τα δικά του Υπό όρους Boolean έκφραση. Κάθε Boolean έκφραση δηλ. Tutorial_name = 'SQL',… αξιολογείται για ΣΩΣΤΟ ΛΑΘΟΣ μέχρι πρώτο Boolean έκφραση που αξιολογεί να ΑΛΗΘΙΝΗ.
Διαφορά μεταξύ απλής και αναζητημένης υπόθεσης
| Απλή υπόθεση | Αναζητημένη υπόθεση |
|---|---|
| Η λέξη-κλειδί CASE ακολουθείται αμέσως από την έκφραση CASE_Expression και πριν από τη δήλωση WHEN.
Π.χ: |
Η λέξη-κλειδί πεζών-κεφαλαίων ακολουθείται από τη δήλωση WHEN και δεν υπάρχει έκφραση μεταξύ CASE και WHEN.
Π.χ: |
| Στην απλή περίπτωση, υπάρχει VALUE για κάθε πρόταση WHEN. Αυτές οι τιμές: Value_1, Value_2… Συγκρίνονται διαδοχικά με μία CASE_Expression. Το αποτέλεσμα αξιολογείται για τη συνθήκη TRUE/FALSE για κάθε δήλωση WHEN.
Π.χ: |
Στην περίπτωση αναζήτησης, υπάρχει Boolean_Expression για κάθε πρόταση WHEN. Αυτή η Boolean_Expressions: Boolean_Expression_1, Boolean_Expression_2,… αξιολογεί τη συνθήκη TRUE/FALSE για κάθε δήλωση WHEN.
Π.χ: |
| Η απλή υπόθεση υποστηρίζει μόνο έλεγχο ισότητας. Δηλαδή εάν CASE_Expression = VALUE_1, VALUE_2…
Π.χ: |
Με το Boolean_Expression_N, το Search Case υποστηρίζει οποιαδήποτε λειτουργία που οδηγεί σε τιμή Boolean. Περιλαμβάνει ίσο και όχι ίσο με χειριστή.
Π.χ: |
Ένθετη ΠΕΡΙΠΤΩΣΗ: CASE σε IF ELSE
Μπορούμε να χρησιμοποιήσουμε ΘΗΚΗ μέσα ΑΝ ΑΛΛΩΣ. Παρακάτω είναι το παράδειγμα κώδικα MS-SQL
DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 190;
IF @Flight_Ticket > 400
PRINT 'Visit Nearby Tourist Location';
ELSE
BEGIN
SELECT
CASE
WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
END AS Location
END
Στο παραπάνω παράδειγμα, το CASE είναι NESTED μέσα στη δήλωση IF…ELSE:
Πρώτον, η Δήλωση IF θα εκτελεστεί και εάν η Κατάσταση Περίπτωσης είναι Διακομιστής SQL είναι False τότε θα εκτελεστεί η δήλωση ELSE.
Αλλιώς περιέχει ένθετη δήλωση CASE σε SQL μέσα σε αυτήν. Ανάλογα με την τιμή του εισιτηρίου πτήσης, θα εμφανιστεί ένα από τα ακόλουθα αποτελέσματα:
- Το σύστημα θα εκτυπώσει "Επίσκεψη κοντινής τουριστικής τοποθεσίας" εάν τα αεροπορικά εισιτήρια είναι > 400 $
- Το σύστημα θα εκτυπώσει "Επισκεφτείτε το Λος Άντζελες" εάν τα αεροπορικά εισιτήρια είναι Μεταξύ 0 $ ΚΑΙ 100 $
- Το σύστημα θα εκτυπώσει "Επισκεφτείτε τη Νέα Υόρκη" εάν τα αεροπορικά εισιτήρια είναι Μεταξύ 101 $ ΚΑΙ 200 $
- Το σύστημα θα εκτυπώσει "Επισκεφτείτε την Ευρώπη" εάν τα αεροπορικά εισιτήρια είναι Μεταξύ 201 $ ΚΑΙ 400 $
Ένθετη θήκη: CASE μέσα σε CASE
Μπορούμε να χρησιμοποιήσουμε CASE μέσα σε CASE στην SQL. Παρακάτω είναι το παράδειγμα κώδικα MS-SQL
DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 250;
SELECT
CASE
WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.'
WHEN @Flight_Ticket < 400 THEN
CASE
WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
END
END AS Location
Στο παραπάνω παράδειγμα, το CASE είναι NESTED μέσα σε μια άλλη πρόταση CASE:
Το σύστημα ξεκινά με την εκτέλεση της εξωτερικής θήκης. Εάν Flight_Ticket < 400 $ τότε θα εκτελεστεί η εσωτερική CASE.
Ανάλογα με την τιμή του εισιτηρίου πτήσης, θα εμφανιστεί ένα από τα ακόλουθα αποτελέσματα:
- Το σύστημα θα εκτυπώσει "Επίσκεψη κοντινής τουριστικής τοποθεσίας" εάν τα αεροπορικά εισιτήρια είναι > 400 $
- Το σύστημα θα εκτυπώσει "Επισκεφτείτε το Λος Άντζελες" εάν τα αεροπορικά εισιτήρια είναι Μεταξύ 0 $ ΚΑΙ 100 $
- Το σύστημα θα εκτυπώσει "Επισκεφτείτε τη Νέα Υόρκη" εάν τα αεροπορικά εισιτήρια είναι Μεταξύ 101 $ ΚΑΙ 200 $
- Το σύστημα θα εκτυπώσει "Επισκεφτείτε την Ευρώπη" εάν τα αεροπορικά εισιτήρια είναι Μεταξύ 201 $ ΚΑΙ 400 $
ΠΕΡΙΠΤΩΣΗ με ΕΝΗΜΕΡΩΣΗ
Υπόθεση: Ας υποθέσουμε ότι έχουμε τον πίνακα ως 'Guru99' με δύο στήλες και τέσσερις γραμμές όπως φαίνεται παρακάτω:
Θα χρησιμοποιήσουμε «GuruΠίνακας 99' σε περαιτέρω παραδείγματα
Μπορούμε να χρησιμοποιήσουμε CASE με UPDATE. Ακολουθεί το παράδειγμα κώδικα MS-SQL:
UPDATE Guru99 SET Tutorial_Name = ( CASE WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.' WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL' WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.' WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.' END )
Στο παραπάνω παράδειγμα, το CASE χρησιμοποιείται στη δήλωση UPDATE.
Ανάλογα με την τιμή Tutorial_Name, η στήλη Tutorial_Name θα λάβει την ενημέρωση με την τιμή TEN Statement.
- Εάν Tutorial_Name = 'SQL' ΤΟΤΕ ενημερώστε το Tutorial_Name σε 'Structured Query Language'
- Εάν Tutorial_Name = 'PL/SQL' ΤΟΤΕ ενημερώστε το Tutorial_Name σε 'Oracle PL/SQL'
- Εάν Tutorial_Name = 'MSSQL' ΤΟΤΕ ενημερώστε το Tutorial_Name σε 'Microsoft SQL'
- Εάν Tutorial_Name = 'Hadoop' ΤΟΤΕ ενημερώστε το Tutorial_Name σε 'Apache Hadoop'
Ας κάνουμε ερωτήσεις Guru99 πίνακας για να ελέγξετε την ενημερωμένη τιμή:
ΠΕΡΙΠΤΩΣΗ με Παραγγελία από
Μπορούμε να χρησιμοποιήσουμε CASE με Order By. Ακολουθεί το παράδειγμα κώδικα MS-SQL:
Declare @Order Int; Set @Order = 1 Select * from Guru99 order by CASE WHEN @Order = 1 THEN Tutorial_ID WHEN @Order = 2 THEN Tutorial_Name END DESC
Εδώ το CASE χρησιμοποιείται με Order By.
Το @Order ορίζεται σε 1 και ως πρώτη όταν η έκφραση Boole αξιολογείται σε TRUE, το Tutorial_ID επιλέγεται για Order by Condition
Ενδιαφέροντα γεγονότα!
- Το CASE μπορεί να είναι ένθετο σε άλλη CASE καθώς και σε άλλη πρόταση IF…ELSE.
- Εκτός από το SELECT, το CASE μπορεί να χρησιμοποιηθεί με άλλο SQL ρήτρα όπως ΕΝΗΜΕΡΩΣΗ, ΠΑΡΑΓΓΕΛΙΑ ΑΠΟ.
Περίληψη
- Στο MS SQL, υπάρχουν δύο τύποι CASE: Απλή ΠΕΡΙΠΤΩΣΗ και Αναζήτηση ΠΕΡΙΠΤΩΣΗΣ
- Το ELSE είναι προαιρετικό στη δήλωση CASE.











