2016-09-18 2 views
0

Also implementiere ich Suchfunktionalität in meine Anwendung, und ich muss die SQL-Abfrage schreiben, die die Datenbank nach Datensätzen auf der Grundlage einer Vielzahl von möglichen Parametern durchsuchen wird. Ich bin auch eine Probe von dem, was ich bisher habe:So erstellen Sie eine SQL-Suchabfrage mit unterschiedlichen Argumenten

SELECT m.*, a.*, p.*, e.* 
FROM members m 
    LEFT JOIN addresses a ON m.member_id = a.address_member_id AND a.preferred_address = TRUE 
    LEFT JOIN phones p ON m.member_id = p.phone_member_id AND p.preferred_phone = TRUE 
    LEFT JOIN emails e ON m.member_id = e.email_member_id AND e.preferred_email = TRUE 
WHERE m.member_id IN (
    (SELECT address_member_id 
    FROM addresses 
    WHERE address = '123 Hart Ct' AND unit = NULL AND city = 'Hometown' AND state = 'NJ' AND zip_code = '08895'), 
    (SELECT phone_member_id 
    FROM phones 
    WHERE area_code = '732' AND prefix = '619' AND line_number = '7826'), 
    (SELECT email_member_id 
    FROM emails 
    WHERE email_address = '[email protected]') 
) 
AND m.first_name = 'Jane' AND m.middle_name = 'Deborah' AND m.last_name = 'Foster' 
ORDER BY member_id ASC; 

Wie Sie sehen, ich bin für Datensätze in der „Mitglieder“ Tabelle auf den Werten in dieser Tabelle sowie die Werte auf Basis der Suche der "bevorzugten" Adresse, Telefon, E-Mail, usw., die damit verbunden sind.

Das Problem besteht darin, dass die obige Abfrage erfordert, dass alle diese Werte bereitgestellt werden. In den meisten Fällen stellt der Benutzer nur eine Handvoll der tatsächlichen Werte zur Verfügung, um die Suche durchzuführen.

Nun, ich weiß, dass eine Option ist, die Abfrage dynamisch in meiner Anwendungsschicht, verketten Strings zusammen und was nicht. Auf diese Weise hätten die WHERE-Klauseln nur die Werte, die für diese spezifische Abfrage benötigt werden. Aber bevor ich das tue, frage ich mich, ob es irgendeinen Weg gibt, dies auf eine reine SQL-Weise zu erreichen?

Ich benutze MYSQL BTW. Vielen Dank.

+0

wenn Sie die Abfrage durch Hibernate oder andere Frameworks Aufruf - Sie Einschränkungen Option für Ihre Bedingungen auf der Grundlage der v Hinzufügen Alue bestanden. Wenn Sie von Ihrer Anwendung aus direkt mit der db verbinden, dann ist der Ansatz, den ich kenne, nur Ihre Abfragezeichenfolge manuell anzuhängen !! – Pat

Antwort

0

Sie haben zwei Möglichkeiten dieses

in rein-SQL Art und Weise zu tun
  1. Der erste Weg, um eine gespeicherte Prozedur verwendet. Mit ihm können Sie IF Bedingung verwenden und die Query-String innerhalb der gespeicherten Prozedur verketten und dann ausführen (kann ich eine Demo zur Verfügung stellen, wenn Sie wollen)

  2. Der zweite Weg, um einen OR Zustand

    SELECT m.*, a.*, p.*, e.* 
    FROM members m 
    LEFT JOIN addresses a ON m.member_id = a.address_member_id 
             AND a.preferred_address = TRUE 
    LEFT JOIN phones p ON m.member_id = p.phone_member_id 
            AND p.preferred_phone = TRUE 
    LEFT JOIN emails e ON m.member_id = e.email_member_id 
            AND e.preferred_email = TRUE 
    WHERE m.member_id IN ((SELECT address_member_id 
             FROM addresses 
             WHERE ('123 Hart Ct' is NULL OR address = '123 Hart Ct') 
             AND (NULL is NULL OR unit = NULL) 
             AND ('Hometown' is NULL OR city = 'Hometown') 
             AND ('NJ' is NULL OR state = 'NJ') 
             AND ('08895' IS NULL OR zip_code = '08895')); 
    
verwendet

Hinweis Sie ersetzen können, ist NULL mit = „“, wenn die Variable NULL leer nicht

wird
Verwandte Themen