Finden am nächsten numerischen Wert in der Datenbank
Ich muss ein select-statement, das wieder entweder ein record, der passt zu meinem Eingang genau, oder die der am ähnlichsten ist, wenn eine exakte übereinstimmung nicht gefunden wird.
Hier ist mein select-Anweisung so weit.
SELECT * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p'
ORDER BY Area DESC
Was ich tun müssen, ist die nächste übereinstimmung zu der "Fläche" - Feld, so dass, wenn meine Eingabe ist 1.125 und der Datenbank enthält 2, 1.5, 1 und 5. die Abfrage der Datensatz enthält 1.
Meine SQL-Kenntnisse sind sehr begrenzt, so dass jede Hilfe wäre sehr geschätzt.
InformationsquelleAutor der Frage Tester101 | 2009-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
erhalten der Unterschied zwischen dem Bereich und Ihren input-nehmen Sie ein absoluter Wert, also immer positiv, dann Reihenfolge aufsteigend und nehmen Sie die erste
InformationsquelleAutor der Antwort MikeW
etwas schreckliches, entlang der Linien von:
Vielleicht?
InformationsquelleAutor der Antwort Ryan Graham
Wenn Sie viele Zeilen, die Erfüllung der Gleichheit von Prädikaten, die auf
Name
Size
undPType
Spalten dann können Sie umfassen Reihe von Prädikaten, die auf derArea
Spalte in Ihre Abfrage. Wenn dieArea
Spalte indiziert ist, könnte dies eine effiziente index-basierten Zugriff.Die folgende Abfrage (geschrieben mit Oracle-syntax) verwendet einen Zweig von einem
UNION ALL
finden Sie den Datensatz mit minimalemArea >=
Ihr Ziel, während der andere Zweig findet den Datensatz mit maximalerArea <
Ihr Ziel. Einer der beiden Datensätze wird der Datensatz, den Sie suchen. Dann können SieORDER BY ABS(Area - ?input)
zu wählen die Sieger aus diesen zwei Kandidaten. Leider ist die Abfrage Komplex ist aufgrund der verschachtelten WÄHLT, die erforderlich sind, um die Durchsetzung der gewünschten ROWNUM /BESTELLUNG DURCH den Vorrang.Einen guten index für diese Abfrage wäre
(Name, Size, PType, Area)
in diesem Fall der erwartete Abfrage-Ausführungsplan basiert auf zwei index range scans, die jeweils eine einzelne Zeile zurückgegeben.InformationsquelleAutor der Antwort George Eadon
Wie etwa der Bestellung durch den Unterschied zwischen Ihrer Eingangs-und [Bereich], wie:
InformationsquelleAutor der Antwort boflynn
-- MarkusQ
InformationsquelleAutor der Antwort MarkusQ
Beachten Sie, dass obwohl die ABS() unterstützt, indem so ziemlich alles, es ist technisch nicht standard (SQL99 zumindest). Wenn Sie schreiben müssen, ANSI-SQL-standard aus irgendeinem Grund, Sie würde arbeiten müssen, um das problem mit einer CASE-operator:
InformationsquelleAutor der Antwort bobince
Wenn Sie MySQL
InformationsquelleAutor der Antwort Alnitak
Wählen Sie die min wobei [Feld] > your_target_value
Wählen Sie den max, wo [Feld] < your_target_value
InformationsquelleAutor der Antwort JustinCaribe