SQL Πού: Εφαρμογές και Παραδείγματα. SQL Όπου οι εφαρμογές και τα παραδείγματα Δείγματα ερωτήματος για επιλογή αριθμητικών τιμών

Αναζήτηση αντικειμένων σε όλες τις βάσεις δεδομένων διακομιστή

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

Ευτυχώς, υπάρχει μια διαδικασία sp_MSforeachdb, το οποίο σας επιτρέπει να γράψετε ένα τέτοιο σενάριο αρκετά συμπαγή:

ΔΗΛΩΣΤΕ το @όνομα ΩΣ SYSNAME,
@strSQL AS VARCHAR(MAX)
SET @name = "Ιεραρχία"

SET @strSQL = "
ΑΝ ΥΠΑΡΧΕΙ(ΕΠΙΛΟΓΗ * ΑΠΟ ?..sysobjects WHERE όνομα LIKE "
"%" [email προστατευμένο]+"%" ")
ΑΡΧΙΖΟΥΝ
ΕΠΙΛΟΓΗ " "?" " db, όνομα ΑΠΟ ?..sysobjects WHERE όνομα LIKE ""%" [email προστατευμένο]+"%" "
ΤΕΛΟΣ
"
ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑ #result (
dbSYSNAME,
όνομα SYSNAME,
ΚΥΡΙΟ ΚΛΕΙΔΙ (db, όνομα))

INSERT #result EXEC sp_MSforeachdb @strSQL
ΕΠΙΛΟΓΗ * ΑΠΟ #αποτέλεσμα

DOP TABLE #result

Όλα είναι πολύ απλά εδώ:

  1. Ορίζουμε το τμήμα του ονόματος με το οποίο θα κάνουμε αναζήτηση (σε αυτήν την περίπτωση - Ιεραρχία).
  2. Συλλέγουμε δυναμική SQL που αναζητά sysobjects (για ορισμένες παλαιότερες εκδόσεις του MS SQL, μπορείτε να χρησιμοποιήσετε το VARCHAR(2000) αντί για το VARCHAR(MAX), για παράδειγμα).
    Σε αυτή την περίπτωση, το σύμβολο "?" θα αντικατασταθεί από το όνομα της βάσης δεδομένων.
  3. Χρησιμοποιώντας την κατασκευή INSERT ... EXEC, αποθηκεύουμε όλα τα αποτελέσματα σε έναν προσωρινό πίνακα για να εμφανίσουμε, ως αποτέλεσμα, ένα μόνο αποτέλεσμα.

Αναζήτηση υποσυμβολοσειράς σε κείμενα αποθηκευμένων διαδικασιών

Όπως γνωρίζετε, τα κείμενα των αποθηκευμένων διαδικασιών, των κανόνων και των προβολών βρίσκονται στον πίνακα syscomments.

Προκειμένου το προηγούμενο αίτημά μας να μας επιτρέψει να βρούμε μια αναφορά σε syscomments κάποιας υποσυμβολοσειράς, μπορεί να ξαναγραφτεί ως εξής:

SET @strSQL="
ΕΠΙΛΟΓΗ ΔΙΑΚΡΙΤΟΥ " "?" "ως db, o.name FROM [?].dbo.syscomments s
JOIN [?].dbo.sysobjects o ON o.id = s.id WHERE s. ΑΡΕΣΕΙ"
"%" [email προστατευμένο]+"%" ""

Δώστε προσοχή στο DISTINCT - μπορεί να σας φανεί χρήσιμο, γιατί μερικές φορές υπάρχουν πολλές εγγραφές στα syscomments για ένα αντικείμενο.

Αναζήτηση για μια δευτερεύουσα συμβολοσειρά σε όλα τα πεδία συμβολοσειράς όλων των πινάκων

Ένα τέτοιο σενάριο βοηθά στον ήσυχο ύπνο αφού «καθαρίσει» τη βάση δεδομένων πριν την στείλει στον πελάτη. Όπως είναι φυσικό, η εφαρμογή του δεν περιορίζεται σε αυτόν τον τομέα.

Για αυτήν την περίπτωση, δεν βρέθηκε βοηθός με τη μορφή διαδικασίας από το MS, οπότε έπρεπε να χρησιμοποιήσω δρομείς:

δήλωση @pattern ως nvarchar(MAX)
set @pattern = N"%Test%"
που δεν υπολογίζει
δήλωση @sql ως nvarchar(MAX)
Δηλώστε το @table ως όνομα συστήματος
δήλωση δρομέα πινάκων τοπικό στατικό read_only για επιλεγμένο όνομα από sys.tables t όπου t.is_ms_shipped = 0
ανοιχτά τραπέζια

δημιουργία πίνακα #results(όνομα sysname όχι null, τιμή nvarchar(MAX) όχι null)
ενώ @@FETCH_STATUS = 0
αρχίζουν
ορίστε @sql=""
επιλέξτε @sql = @sql + "
εισαγάγετε στο #results επιλέξτε"
"" + @table + "." + όνομα + "" " ως όνομα, [" + όνομα + "] από [" + @table + "] όπου [" + όνομα + "] όπως " "" + @pattern + "" ""
από sys.columns c όπου c.object_id = OBJECT_ID(@table ) και c.system_type_id σε
(επιλέξτε system_type_id από sys.types όπου το collation_name δεν είναι null )
exec (@sql)
ανάκτηση του επόμενου από πίνακες στο @table
τέλος
επιλέξτε * από το #results
κλείστε τραπέζια
πτώση πίνακα #αποτελέσματα

Εκτός από τους δρομείς, οι αρχές είναι οι ίδιες. Υπάρχουν μερικές αποχρώσεις:

  • Αναζητούμε πίνακες χωρίς τη σημαία is_ms_shipped για να προβάλουμε μόνο πίνακες που δημιουργήθηκαν κατά την ανάπτυξη.
  • Για την επιλογή στηλών συμβολοσειρών, αντί για μια λίστα τύπων (που είναι κουραστικό να διατηρηθεί), χρησιμοποιείται το φίλτρο "collation_name is not null".

Περίληψη

Ο προσεκτικός αναγνώστης πρέπει να έχει μαντέψει από το σχέδιο ότι το τελευταίο παράδειγμα δεν γράφτηκε ταυτόχρονα με τα δύο πρώτα. Για να είμαι πιο ακριβής, το τελευταίο αίτημα το έγραψα πριν ένα μήνα. Αυτό εννοώ ότι με βάση αυτήν την προσέγγιση, μπορείτε να γράψετε μόνοι σας χρήσιμα σενάρια που λύνουν τα συγκεκριμένα προβλήματά σας.

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

Εάν έχετε σχόλια, προτάσεις ή νέα θέματα - γράψτε στα σχόλια,

Είναι δύσκολο να εξηγηθεί η σύνταξη για τον όρο SQL Server WHERE, οπότε ας δούμε μερικά παραδείγματα.

Θα ξεκινήσουμε εξετάζοντας τον τρόπο χρήσης της ρήτρας WHERE με μία μόνο προϋπόθεση.

ΕΠΙΛΟΓΗ * ΑΠΟ εργαζομένους WHERE first_name = "Jane";

Σε αυτό το παράδειγμα όρου SQL Server WHERE, χρησιμοποιήσαμε τον όρο WHERE για να φιλτράρουμε τα αποτελέσματά μας από το υπαλλήλουςτραπέζι. Η παραπάνω δήλωση SELECT θα επέστρεφε όλες τις σειρές από το υπαλλήλουςπίνακας όπου το όνομαείναι η «Τζέιν». Επειδή το * χρησιμοποιείται στο SELECT, όλα τα πεδία από το υπαλλήλουςο πίνακας θα εμφανιστεί στο σύνολο αποτελεσμάτων.

Παράδειγμα - Χρήση συνθηκών ΚΑΙ

Ας δούμε πώς χρησιμοποιείται η ρήτρα WHERE με τη συνθήκη AND.

ΕΠΙΛΟΓΗ * ΑΠΟ εργαζομένους WHERE last_name = "Anderson" AND staff_id >= 3000;

Αυτό το παράδειγμα όρου SQL Server WHERE χρησιμοποιεί τον όρο WHERE για να ορίσει πολλαπλές συνθήκες. Σε αυτήν την περίπτωση, αυτή η πρόταση SELECT χρησιμοποιεί τη συνθήκη ΚΑΙ για να επιστρέψει όλα υπαλλήλουςπου έχουν α επίθετοτου «Άντερσον» και του Ταυτότητα Υπαλλήλουείναι μεγαλύτερο ή ίσο με 3000.

Παράδειγμα - Χρήση συνθήκης OR

Ας δούμε πώς να χρησιμοποιήσετε τον όρο WHERE με τη συνθήκη OR.

SELECT staff_id, last_name, first_name FROM υπαλλήλους WHERE last_name = "Johnson" OR first_name = "Danielle";

Αυτό το παράδειγμα όρου του SQL Server WHERE χρησιμοποιεί τον όρο WHERE για να ορίσει πολλαπλές συνθήκες, αλλά αντί να χρησιμοποιεί τη συνθήκη AND , χρησιμοποιεί τη συνθήκη OR . Σε αυτήν την περίπτωση, αυτή η δήλωση SELECT θα επιστρέψει όλα Ταυτότητα Υπαλλήλου, επίθετο, και όνομααξίες από το υπαλλήλουςπίνακας όπου το επίθετοείναι «Τζόνσον» ή το όνομαείναι η «Ντανιέλ».

Παράδειγμα - Συνδυασμός AND & OR συνθηκών

Ας δούμε πώς να χρησιμοποιήσουμε τον όρο WHERE όταν συνδυάζουμε τις συνθήκες AND & OR σε μια μεμονωμένη πρόταση SQL.

ΕΠΙΛΟΓΗ * ΑΠΟ εργαζομένους WHERE (state = "California" AND last_name = "Smith") Ή (employee_id = 82);

Αυτό το παράδειγμα όρου του SQL Server WHERE χρησιμοποιεί τον όρο WHERE για να ορίσει πολλαπλές συνθήκες, αλλά συνδυάζει τη συνθήκη AND και τη συνθήκη OR . Αυτό το παράδειγμα θα επέστρεφε όλα υπαλλήλουςπου κατοικούν στο κατάστασητου «Καλιφόρνια» και του οποίου επίθετοείναι ο «Σμιθ» καθώς και όλοι οι εργαζόμενοι των οποίων Ταυτότητα Υπαλλήλουισούται με 82.

Οι παρενθέσεις καθορίζουν τη σειρά που το καιΟι συνθήκες OR αξιολογούνται. Όπως ακριβώς μάθατε με τη σειρά των πράξεων στο μάθημα των Μαθηματικών!

Παράδειγμα - Συμμετοχή πινάκων

Ας δούμε πώς να χρησιμοποιήσουμε την ρήτρα WHERE όταν ενώνουμε πολλούς πίνακες μαζί.

ΕΠΙΛΕΞΤΕ staffs.employee_id, contacts.last_name ΑΠΟ υπαλλήλους ΕΣΩΤΕΡΙΚΗ ΣΥΝΔΕΣΗ επαφών ON staffs.employee_id = contacts.contact_id WHERE staffs.first_name = "Sarah";

Αυτό το παράδειγμα ρήτρας WHERE του SQL Server χρησιμοποιεί τον όρο WHERE για να ενώσει πολλούς πίνακες σε μία πρόταση SELECT. Αυτή η δήλωση SELECT θα επέστρεφε όλες τις σειρές όπου το όνομαστο υπαλλήλουςτο τραπέζι είναι "Σάρα". Και το υπάλληλος s και επαφέςπίνακες ενώνονται στο Ταυτότητα Υπαλλήλουαπό το υπαλλήλουςτραπέζι και το contact_idαπό το επαφέςτραπέζι.

Στις περισσότερες περιπτώσεις, δεν χρειάζεται να ανακτήσετε όλες τις εγγραφές, αλλά μόνο αυτές που πληρούν ορισμένα κριτήρια. Επομένως, για να φιλτράρετε την επιλογή σε SQLυπάρχει ειδικός χειριστής ΟΠΟΥ.

1. Απλό φιλτράρισμα με τον τελεστή WHERE.

Ας επιλέξουμε, για παράδειγμα, εγγραφές από τον πίνακα μας που αφορούν μόνο ένα συγκεκριμένο προϊόν. Για να γίνει αυτό, θα καθορίσουμε μια πρόσθετη παράμετρο επιλογής που θα φιλτράρει την τιμή ανά στήλη Προϊόν.

Δείγμα ερωτήματος για την επιλογή τιμών κειμένου:

ΕΠΙΛΕΓΩ * FROM Sumproduct WHERE Προϊόν = "Ποδήλατα"

Όπως μπορείτε να δείτε, η συνθήκη επιλογής περικλείεται σε μονά εισαγωγικά, κάτι που είναι υποχρεωτικό κατά το φιλτράρισμα τιμών κειμένου. Τα εισαγωγικά δεν χρειάζονται κατά το φιλτράρισμα αριθμητικών τιμών.

Δείγμα ερωτήματος για την επιλογή αριθμητικών τιμών:

ΕΠΙΛΕΓΩ > 40000 ΤΑΞΙΝΟΜΗΣΗ ΚΑΤΑ Ποσό

Σε αυτό το παράδειγμα, έχουμε επιλέξει εγγραφές στις οποίες τα έσοδα από τις πωλήσεις ήταν περισσότερα από 40 χιλιάδες $και, επιπλέον, όλες οι εγγραφές ταξινομούνται με αύξουσα σειρά ανά πεδίο Ποσό.

Ο παρακάτω πίνακας παραθέτει τις υποστηριζόμενες δηλώσεις SQL:

2. Φιλτράρισμα κατά εύρος τιμών ( ΜΕΤΑΞΥ).

Για να επιλέξετε δεδομένα που βρίσκονται σε ένα συγκεκριμένο εύρος, χρησιμοποιήστε τον τελεστή ΜΕΤΑΞΥ. Το επόμενο ερώτημα θα επιλέξει όλες τις τιμές μεταξύ 1000 $ V 2000 $ χωρίς αποκλεισμούς, στο πεδίο Ποσό.

ΕΠΙΛΕΓΩ * ΑΠΟ Sumproduct WHERE Ποσό ΜΕΤΑΞΥ 1000 ΚΑΙ 2000

Η σειρά ταξινόμησης θα εξαρτηθεί από τη σειρά των πεδίων στο ερώτημα. Δηλαδή, στην περίπτωσή μας, τα δεδομένα θα ταξινομηθούν πρώτα ανά στήλη Ποσό, και μετά από Πόλη.

3. Επιλογή κενών εγγραφών ( ΕΙΝΑΙ ΜΗΧΑΝΟ).

ΣΕ SQLυπάρχει ένας ειδικός τελεστής για την επιλογή κενών εγγραφών (καλείται ΜΗΔΕΝΙΚΟ). Μια κενή καταχώρηση είναι οποιοδήποτε κελί σε έναν πίνακα που δεν περιέχει χαρακτήρες. Εάν εισαχθεί το κελί 0 ή χώρος, τότε το πεδίο θεωρείται συμπληρωμένο.

ΕΠΙΛΕΓΩ * ΑΠΟ Sumproduct WHERE Ποσό ΕΙΝΑΙ ΜΗΧΑΝΟ

Στο παραπάνω παράδειγμα, αφαιρέσαμε σκόπιμα δύο τιμές στο πεδίο Ποσόγια την επίδειξη της λειτουργίας του χειριστή ΜΗΔΕΝΙΚΟ.

4. Προηγμένο φιλτράρισμα ( ΚΑΙ, Ή).

Γλώσσα SQLδεν περιορίζεται στο φιλτράρισμα κατά μία συνθήκη, για δικούς σας σκοπούς μπορείτε να χρησιμοποιήσετε αρκετά περίπλοκες δομές για να επιλέξετε δεδομένα ταυτόχρονα με πολλά κριτήρια. Για αυτό σε SQLυπάρχουν επιπλέον χειριστές που επεκτείνουν τις δυνατότητες του χειριστή ΟΠΟΥ. Αυτοί οι τελεστές είναι: ΚΑΙ, Ή, ΜΕΣΑ, ΟΧΙ. Ακολουθούν μερικά παραδείγματα για το πώς λειτουργούν αυτοί οι τελεστές.

ΕΠΙΛΕΓΩ * ΑΠΟ Sumproduct WHERE Ποσό > 40000 ΚΑΙ Πόλη = "Τορόντο"

ΕΠΙΛΕΓΩ * FROM Sumproduct WHERE Μήνας= "Απρίλιος"Ή μήνας= "Μάρτιος"

Ας συνδυάσουμε τελεστές ΚΑΙΚαι Ή. Για να γίνει αυτό, ας κάνουμε μια επιλογή από ποδήλατα ( Ποδήλατα ) και πατίνια ( πατίνια ), τα οποία πουλήθηκαν τον Μάρτιο (Μάρτιος ).

ΕΠΙΛΕΓΩ * FROM Sumproduct WHERE Προϊόν= "Ποδήλατα"Ή Προϊόν= "παίνια" ΚΑΙ μήνας= "Μάρτιος"

Βλέπουμε ότι το δείγμα μας περιελάμβανε πολλές τιμές (εκτός από τον Μάρτιο ( Μάρτιος), επίσης τον Ιανουάριο ( Ιανουάριος), Φεβρουάριος ( Φεβρουάριος) και τον Απρίλιο ( Απρίλιος)). Ποιός είναι ο λόγος? Και σε αυτό SQLέχει προτεραιότητες εκτέλεσης εντολών. Ο χειριστής δηλαδή ΚΑΙέχει μεγαλύτερη προτεραιότητα από τον τελεστή Ή, οπότε επιλέχθηκαν πρώτα οι δίσκοι με πατίνια που πουλήθηκαν τον Μάρτιο και μετά όλοι οι δίσκοι που σχετίζονται με τα ποδήλατα.

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

ΕΠΙΛΕΓΩ * FROM Sumproduct WHERE (Προϊόν= "Ποδήλατα"Ή Προϊόν= "παίνια") ΚΑΙ μήνας= "Μάρτιος"

5. Προηγμένο φιλτράρισμα ( Χειριστής IN).

ΕΠΙΛΕΓΩ * ΑΠΟ Sumproduct WHERE IDΣΕ (4, 12, 58, 67)

Χειριστής ΣΕεκτελεί την ίδια λειτουργία με ΉΩστόσο, έχει μια σειρά από πλεονεκτήματα:

  • Όταν εργάζεστε με μεγάλες λίστες, η πρόταση με ΣΕευκολότερο να διαβαστεί?
  • Χρησιμοποιούνται λιγότεροι χειριστές, γεγονός που επιταχύνει την επεξεργασία αιτημάτων.
  • Το πιο σημαντικό πλεονέκτημα ΣΕστο ότι στην κατασκευή του είναι δυνατή η χρήση πρόσθετης κατασκευής ΕΠΙΛΕΓΩ, Τι
  • ανοίγει μεγάλες ευκαιρίες για τη δημιουργία πολύπλοκων υποερωτημάτων.

6. Προηγμένο φιλτράρισμα ( ΟΧΙ χειριστής).

ΕΠΙΛΕΓΩ * ΑΠΟ Sumproduct WHERE NOT ΠόληΣΕ ("Τορόντο", "Μόντρεαλ")

Λέξη-κλειδί ΔΕΝσας επιτρέπει να αφαιρέσετε περιττές τιμές από την επιλογή. Επίσης, το χαρακτηριστικό του είναι ότι τοποθετείται πριν από το όνομα της στήλης που εμπλέκεται στο φιλτράρισμα, και όχι μετά.

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

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

Καταρχήν, αυτός ο τελεστής έχει τουλάχιστον δύο μορφές σε διαφορετικές βάσεις δεδομένων. Η πρώτη επιλογή μοιάζει με το συνηθισμένο διακόπτη από οποιαδήποτε γλώσσα προγραμματισμού. Το δεύτερο εξαρτάται από δυαδικές εκφράσεις.

Ωστόσο, σε αυτό το άρθρο, θα εξετάσω τη δεύτερη επιλογή, καθώς δεν έχει προβλήματα με καταστάσεις όπως CASE WHEN NULL (το null δεν είναι μια συγκεκριμένη τιμή στη βάση δεδομένων, επομένως δεν μπορεί να χρησιμοποιηθεί σε μια δήλωση όπως το switch). Επιπλέον, στην καθημερινή ζωή, οι εργασίες συναντώνται συχνότερα ειδικά για τη δεύτερη επιλογή - υπολογισμό μέσω λογικών εκφράσεων. Επομένως, είναι καλύτερο να το μάθετε αμέσως και να συνεχίσετε να το χρησιμοποιείτε.

Συνήθως, περιγράφεται ως εξής (η σύνταξη μπορεί να διαφέρει ανάλογα με τη βάση δεδομένων):

ΠΕΡΙΠΤΩΣΗ ΟΤΑΝ bool_expression1 ΤΟΤΕ τιμή1 ..... ΟΤΑΝ bool_expressionN ΤΟΤΕ τιμήN ΑΛΛΩΣ τιμήAlse ΤΕΛΟΣ

Το bool_expressionX είναι μια δυαδική συνθήκη

Η τιμήΧ είναι η τιμή που θα αντικατασταθεί εάν πληρούται η αντίστοιχη δυαδική συνθήκη

valueElse είναι η τιμή που θα αντικατασταθεί εάν δεν έχει εκπληρωθεί προηγουμένως καμία συνθήκη.

Μετά από μια τόσο μικρή αναφορά, ας περάσουμε στην πρακτική.

Σημείωση: Παρεμπιπτόντως, αξίζει να γνωρίζετε ότι συνήθως αυτή η δήλωση μπορεί να χρησιμοποιηθεί όχι μόνο σε επιλεγμένα, αλλά και σε οποιοδήποτε μέρος όπου μπορούν να χρησιμοποιηθούν πεδία. Για παράδειγμα, όταν ενώστε τραπέζιαή ακόμη και φιλτράρισμα (έχοντας) κατά την ομαδοποίηση (ομαδοποίηση κατά).

Δήλωση υπό όρους ΠΕΡΙΠΤΩΣΗ...ΟΤΑΝ...ΤΟΤΕ

Για να καταλάβετε καλύτερα την ΠΕΡΙΠΤΩΣΗ...ΟΤΑΝ...ΤΟΤΕ δήλωση υπό όρους, φανταστείτε ένα μικρό πρόβλημα. Ας υποθέσουμε ότι έχετε έναν πίνακα με δεδομένα σχετικά με τους πελάτες και τον συνολικό αριθμό αγορών τους. Και το καθήκον είναι να σχηματίσετε δυναμικά μια έκπτωση. Θα ήταν δυνατό, φυσικά, να ορίσετε την έκπτωση χειροκίνητα. Ωστόσο, έχετε ένα κατώφλι και τα κατώφλια είναι ενσύρματα (κάτι σαν - το ποσό είναι πάνω από 1000 λάβετε έκπτωση 2% και πάνω από 5000 - λάβετε 5%) και θα θέλατε να αυτοματοποιήσετε αυτήν τη διαδικασία ώστε να το κάνετε δεν χρειάζεται να ψάχνετε για σφάλματα κάθε φορά που εμβαθύνετε στη βάση δεδομένων (ο πελάτης έχει συγκεντρώσει το απαιτούμενο ποσό - η έκπτωση εμφανίστηκε αυτόματα).

Ας πάρουμε έναν πελάτη πίνακα υπό όρους με τρεις πελάτες. Για παράδειγμα, θα είναι αρκετά.

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

1. Ποσό από 1000 - έκπτωση 2%.

2. Ποσό από 5000 - 5% έκπτωση

3. Ποσό από 10000 - έκπτωση 8%.

4. Ποσότητα παραγγελιών από 10 - 7% έκπτωση

5. Ποσότητα παραγγελιών από 20 - 8% έκπτωση

Όπως μπορείτε να δείτε, η έκπτωση εξαρτάται από δύο παράγοντες: το ποσό και την ποσότητα. Τώρα, ας προσπαθήσουμε να δημιουργήσουμε προϋποθέσεις από αυτά με βάση την έκπτωση, δηλαδή οι κανόνες είναι αντίστροφοι ώστε να μπορούν να χρησιμοποιηθούν σε ένα ερώτημα sql. Παίρνουμε τα εξής:

1. 2% - Ποσό από 1000 έως 4999 και ο αριθμός παραγγελιών είναι μικρότερος από 10.

2. 5% - Ποσό από 5000 έως 9999 και ο αριθμός παραγγελιών είναι μικρότερος από 10.

3. 7% - Αριθμός παραγγελιών από 10 έως 19 και το ποσό είναι μικρότερο από 10000

4. 8% - Ποσότητα από 20 ή ποσό από 10000

Τώρα, το μόνο που μένει είναι να το γράψετε. Λάβετε το ακόλουθο ερώτημα sql

Εμφάνιση του ονόματος και άλλων δεδομένων επιλέξτε όνομα, order_count, total_sum, -- Και τώρα εμφανίζεται η έκπτωση ΠΕΡΙΠΤΩΣΗ -- Πρώτος κανόνας 2% ΟΤΑΝ c.total_sum >= 1000 και c.total_sum<= 4999 and c.order_count < 10 THEN 2 -- Второе правило 5% WHEN c.total_sum >= 5000 και c.total_sum<= 9999 and c.order_count < 10 THEN 5 -- Третье правило 7% WHEN c.total_sum < 10000 and c.order_count >= 10 και c.order_count<= 19 THEN 5 -- Четвертое правило 8% WHEN c.total_sum >= 10000 ή c.order_count >= 20 ΜΕΤΑ 5 -- Δεν ταιριάζουν κανόνες, επομένως η έκπτωση είναι 0. ΑΛΛΟ 0 ΤΕΛΕΙΩΣΗ ως έκπτωση από τον πελάτη c

Ως αποτέλεσμα της εκτέλεσης, παίρνουμε τον ακόλουθο πίνακα:

Όπως μπορείτε να δείτε, δύο πελάτες έλαβαν έκπτωση 8 τοις εκατό και ένας πελάτης έλαβε έκπτωση 2 τοις εκατό. Ταυτόχρονα, με κάθε παραγγελία θα υπολογίζεται αυτόματα το ποσοστό και δεν θα χρειάζεται να προσαρμόσετε τίποτα. Για παράδειγμα, εάν το ποσό του Petya αυξηθεί σε 5000, τότε η έκπτωση του θα ανέλθει αυτόματα στο 5% (τουλάχιστον, αφού υπάρχουν ακόμη αρκετές παραγγελίες).

mob_info