Προς το περιεχόμενο

Multiple optional query parameters με PostgreSQL


Προτεινόμενες αναρτήσεις

Δημοσ.

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

Εχω λοιπον PostgreSQL10 και θελω να φτιαξω queries με πολλά parameters, τα οποια θα ειναι optional. 
Ο χρηστης μπορει να επιλεξει υποχρεωτικα ονομα περιοχης και μετα μπορει να επιλεξει κάτι (ή και τίποτα) απο τα παρακατω : συμβαν,  ημερομηνια συμβαντος, κατηγορια, ημερομηνια κατηγοριας, στιλ.
Οποτε : "ολα τα καταστηματα (κατηγορια), που χτιστικαν το 1990 (ημερομηνια κατηγοριας) , με μπαροκ αρχιτεκτονικη (στιλ) , που επιασαν φωτια το 1995 (συμβαν και ημερομηνια του) και βρισκονται στη Γουαδελουπη (ονομα περιοχης)".

Το βασικο προβλημα ειναι οτι περιοχη, συμβαν, κατηγορια και στιλ ειναι σε διαφορετικους πινακες,  οι οποιοι συνδεονται και με many-to-many , οποτε δεν μπορω να κανω κατι σαν 
 

SELECT * FROM mytable
WHERE (Event IS NULL OR Event = event) 

το οποιο ειναι και λαθος γενικοτερα, λογω διαφορας cached plan και αναγκης recompile every single f**king time. Οποτε υποθετω, για τον ιδιο λογω είναι και λαθος να αρχισω να κανω JOIN 4 πινακες χυμαδιο.

Θα μπορούσα να βρω το id περιοχης, μιας και ειναι και υποχρεωτικο, αλλα το προβλημα ειναι οτι δε ξερω τι απο τα αλλα 3 επελεξε ο χρηστης για να βρω σε ποιον many-to-many θα το συγκρινω. Ε ουτε ειναι πολυ λογικο να εχω καμια 10 if.

Ιδεες, παραδειγματα, tutorial, θεωριες, chow main noodles με λαχανικα και κοτοπουλο και μια κοακολα, ολα ευπροσδεκτα.
Eυχαριστω

01.png

Δημοσ.
11 ώρες πριν, TheDarkKnight είπε

Δοκίμασε να σπάσεις το query σε substrings.

Δηλαδη?...Δωσε ενα παραδειγμα σε παρακαλω , γιατι δε βλεπω τι ακριβως πρεπει να κανω. Thanks

Δημοσ. (επεξεργασμένο)

String joinPart = "";

String clausePart = "";

if(){ //ελέγχεις αν ο χρήστης έχει επιλέξει κάτι σχετικά με τη κατηγορία

joinPart = " INNER JOIN Area-Category ON Area.Id = Area-Category.AreaId INNER JOIN Category ON Area-Category.CategoryId = Category.id ";

clausePart = " AND Category.Id = :catid";

}

if(){ //ελέγχεις αν ο χρήστης έχει επιλέξει κάτι σχετικά με το στυλ

joinPart = " INNER JOIN Area-Category ON Area.Id = Area-Category.AreaId INNER JOIN Category ON Area-Category.CategoryId = Category.Id INNER JOIN Style-Category ON Category.Id = Style-Category.CategoryId INNER JOIN Style ON Style-Category.StyleId = Style.Id ";

clausePart += " AND Style.id = :stylid";

}

String query = "SELECT * FROM Event INNER JOIN Area-Event ON Event.Id = Area-Event.EventId INNER JOIN Area ON Area-Event.AreaId = Area.Id" + joinPart + "WHERE Area.Id = :arid" + clausePart;

Επεξ/σία από TheDarkKnight
  • Like 1
Δημοσ.

Σε ευχαριστω γιατην απαντηση φιλε μου, καταλαβα τι εννοουσες με το "substrings". Δε το ξεχναω το θεμα, απλα το ψαχνω λιγο με dynamic sql γιατι με static και joins εχει τα προβληματα που αναφερα στην αρχη. Dynamic sql δεν εχω ξαναφτιαξει, οποτε θα μου παρει λιγο καιρο και ελπιζω να επανελθω με καποια προταση σχετικη.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...