2017-02-02 2 views
0

festgelegt werden, schwer zu expliziten in dem Thema, muss das Problem zu erklären.sql where-Klausel - Best Practice: Übereinstimmende Felder können nur ausgewählt werden, wenn die anderen Felder übereinstimmen, oder auf Null

In diesem wählen:

SELECT `id`, `creation_time`, `roster_date`, `roster_type`,`roster_report_time`, `flight_hrs`, `rank`, `email` 
FROM `alert_subscriptions` 
WHERE 1 

Ich habe eine fixe Kombination der Begriffe 'Rang' Werte 'roster_date' und 'roster_type' zu verwenden, in der where-Klausel. Das Problem ist, dass ich finden muss, wer nur einen Wert in 'rank' eingefügt hat und andere Felder auf null gesetzt hat oder wer 'rank' und 'roster_date' gesetzt hat, während 'roster_type' auf null gesetzt ist, und so weiter .

Wer ein passendes Feld hat, darf nur ausgewählt werden, wenn die anderen Felder übereinstimmen oder auf null gesetzt sind.

Eine Lösung ist natürlich, in die Where-Klausel alle möglichen Kombinationen zu setzen (in diesem Fall 7, zB ranknullnullORnulldatenullORnullnulltypeORrankdatenullORranknulltyp .. und so weiter ..) aber ich würde gerne eine elegante Lösung finden, auch einfach mit zu aktualisieren mehr Felder (diese Lösung würde mich verrückt machen, die where Klausel mehr Felder hinzufügend, würde die Zahl der Kombination enorm steigen!)

Ich bin sicher, dass es eine Lösung mit irgendeiner Auswahl oder Vereinigung oder Ansicht gibt, aber wenn ich komme In der Nähe der Lösung verliere ich mich und kann mich nicht entscheiden.

Ich bin fest, ich brauche eine externe Sicht.

Danke alle

+1

Ich kann nicht herausfinden, was Sie fragen. Können Sie einige Beispieldaten und das gewünschte Ergebnis zeigen? – Barmar

+0

Ich vermute, was Sie wollen ist, um die Ergebnisse zu sortieren, ob sie die verschiedenen Kriterien entsprechen, dann verwenden Sie LIMIT 1, um die erste Übereinstimmung zu erhalten. – Barmar

+0

Ich möchte ein Auto verkaufen, 2010, 2L, Waggon. Mike sucht nach einem Wagen 3L. Bob für einen Wagen. Luke für einen Wagen 2L. Ich möchte, dass ich Bob und Luke zeige. Wenn ich in meiner WHERE-Klausel das Jahr UND die Größe UND das Chassis eingeben würde, würde es mir keine Ergebnisse geben. Wenn ich OR benutze, würde es mir alle geben. Der einzige Weg, den ich in meinem Kopf habe, ist, in der Klausel alle Kombinationen zu beschreiben. Aber ich bin mir sicher, dass es eine intelligentere Lösung gibt. –

Antwort

2

einfach überprüfen, ob jede Kriterien NULL ist, und behandeln, dass als erfolgreicher Teil des Spiels. Sie können dann jeden Kriterien-Test mit OR kombinieren.

WHERE (year IS NULL OR year = 2010) 
AND (type IS NULL OR type = 'wagon') 
AND (size IS NULL OR size = '2L') 
+0

Da 'x = NULL' immer NULL ist, könnte man auch' IFNULL (Jahr = 2010, 1) 'oder' COALESCE (..) ' –

+0

schreiben, also eigentlich wo Jahr = 2010 und Größe = 2l und Typ = Wagen und ifnull (Jahr, 2010) = 2010 ... etc .. oder? –

+0

Nein, du brauchst den ersten Teil nicht, nur das 'ifnull' Zeug. – Barmar

Verwandte Themen