2016-06-20 4 views
0

Wie kann ich Datensätze aus meiner Tabelle abrufen, wenn eine Liste ganzer Zahlen in dem durch SpalteA und SpalteB definierten Bereich liegt?SQL-Abfrage zum Auswählen von Datensätzen, bei denen eine beliebige Liste ganzer Zahlen zwischen columnA und columnB liegt

Ich kenne den IN-Operator beim Vergleich mit einem Spaltenwert anstelle eines durch ein Spaltenpaar definierten Bereichs.

Zum Beispiel: select * from mytable where mytable.colA in (1,3,5,6); würden alle Datensätze erhalten, wo colA entweder 1,3,5 oder 6

Gibt es so etwas für Bereiche? Oder sollte ich mag:

select * from mytable where 1 between mytable.colA and mytable.colb OR 3 between mytable.colA and mytable.colb OR 5 between mytable.colA and mytable.colb OR 6 between mytable.colA and mytable.colb;

+0

Das ist nicht besonders klar. Bitte geben Sie Beispiele für die Daten an, mit denen Sie arbeiten, zusammen mit einem Beispiel für die gewünschten Ergebnisse. –

+0

zur Verdeutlichung hinzugefügt Beispiele – NotGaeL

+0

Verwenden Sie größer '> als und weniger' <'als für Bereiche:' WHERE (mytable.colA> 1 AND mytable.colA <6) ODER (mytable.colB> 1 AND mytable.colB <6) ' –

Antwort

3

Vielleicht so:

select distinct mytable.* 
from mytable 
join (select 1 nr union all select 3 union all select 5 union all select 6) n 
    on n.nr between mytable.colA and mytable.colb 

Update:

gerade getestet auf MariaDB (10.0.19) und eine 1 M-Reihe indiziert Tabelle .. Ihre ursprüngliche Abfrage ist viel schneller.

+0

(Über dein Update): Interessant. Ich habe beide Lösungen für Postgres (Indizes für ColA und ColB) ausprobiert und fand keinen großen Unterschied. Auf jeden Fall wird es zu einer regelmäßig aktualisierten materialisierten Ansicht, sodass Leistung kein kritisches Thema ist. Ich hoffte auf eine sehr einfache Abfrage wie 'SELECT * FROM meine Tabelle WHERE colA, colB IN (Wert1, ..., WertN)', aber Bestätigung dort ist nicht eine ist gut genug. – NotGaeL

1

Eine gängige Taktik besteht darin, eine temporäre Tabelle einzurichten und diese für den Beitritt zu Ihrer Haupttabelle zu verwenden.

Eine einfache Möglichkeit, eine erstellen ist wie so:

DECLARE @TempList table (LookFor int not null) 

INSERT @TempList (LookFor) values 
    (1) 
,(3) 
,(5) 
,(6) 

Da es sich um eine Tabelle, können Sie Logik verwenden Abfragen um es zu füllen.

Als nächstes kommen Sie zu Ihrer Zieltabelle. Für Ihr Beispiel oben:

SELECT mt.* 
from myTable mt 
    inner join @TempList tl 
    on tl.LookFor = mt.ColA 

Und wenn ich mich richtig zu interpretieren, könnte das sein, was Sie wirklich suchen:

SELECT mt.* 
from myTable mt 
    inner join @TempList tl 
    on tl.LookFor between mt.ColA and mt.ColB 
Verwandte Themen