Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - SELECT * WHERE (die letzten Datensätze bis ein bool = true)


Christoph1972 - Do 21.06.12 17:05
Titel: SELECT * WHERE (die letzten Datensätze bis ein bool = true)
Hallo Leute,

ich würde gerne wissen, ob sich mittels SQL folgende Aufgabenstellung lösen lässt.

Und zwar habe ich folgende Tabellen Struktur:


Quelltext
1:
2:
3:
4:
5:
6:
7:
ID  Irgendwas  EinBool
1      dsad      false
2      juzu      false
3      dsak      true
4      khjh      false
5      1234      false
6      5678      false



Ich möchte die letzten Datensätze bis zum ersten true selektieren.

Das Ergebnis soll so aussehen:


Quelltext
1:
2:
3:
4:
5:
ID  Irgendwas  EinBool
3      dsak      true
4      khjh      false
5      1234      false
6      5678      false



Ist das überhaupt möglich? Über Tipps und Anregungen freue ich mich wie immer!


Ralf Jansen - Do 21.06.12 17:55

Wenn ID dein Kriterium für die Reihenfolge ist dann


SQL-Anweisung
1:
2:
3:
4:
5:
SELECT * 
  FROM table
 WHERE ID >= (SELECT min(ID)
                FROM table
               WHERE EinBool = 'true')


Sollte eigentlich in jeder halbwegs ANSI konformen DB funktionieren. Das Verhalten eines Bool, wenn die DB den Typ überhaupt kennt, ist das einzige DB spezifische (ob 1,0 oder true, false oder 'true', 'false' oder ...).


Christoph1972 - Do 21.06.12 19:45

Ah super! Meine theoretische Lösung hat ähnlich ausgesehen. Ich werde mich morgen mal an die Umsetzung machen.

Vielen Dank schon mal!


Sinspin - Do 21.06.12 20:54

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

SQL-Anweisung
1:
2:
3:
4:
5:
SELECT * 
  FROM table
 WHERE ID >= (SELECT min(ID)
                FROM table
               WHERE EinBool = 'true')

Das haut hin solange in der Tabelle nur ein 'true' drinne ist. Sind es mehr wird alles ab dem ersten geliefert. Es soll aber alles ab dem letzten geliefert werden wenn ich das richtig verstanden habe.

SQL-Anweisung
1:
2:
3:
4:
5:
SELECT *
  FROM table
 WHERE ID >= (SELECT TOP 1 ID
                FROM table
               WHERE EinBool = 'true' ORDER BY ID DESC)

Irgendwie habe ich zwar das Gefühl das es noch einfacher geht aber ich komme nicht drauf.


Ralf Jansen - Do 21.06.12 21:21

Zitat:
Das haut hin solange in der Tabelle nur ein 'true' drinne ist. Sind es mehr wird alles ab dem ersten geliefert


Christoph hat geschrieben

Zitat:
Ich möchte die letzten Datensätze bis zum ersten true selektieren.


Sollte Christoph gemeint haben was er schrieb ist min(ID) richtig und man kann halt dann auch mehrere Datensätze mit EinBool = true im Ergebnis haben. Ist deine Interpretation richtig dann machen wir halt aus dem min(ID) ein max(ID). Vermutlich ist ein min bzw. max auch schneller als Top + Order by (ASC oder DESC).

Zitat:
Irgendwie habe ich zwar das Gefühl das es noch einfacher geht aber ich komme nicht drauf.


Einfacher wird es nicht. Man hat immer einen Vergleich mit anderen Datensätzen in der gleichen Tabelle. Die Tabelle wird also immer 2 mal gebraucht werden. Alternativ kann man auch Lösungen mit einem Self-Join versuchen. Sind aber nicht einfacher und persönlich halte ich einen Subselect für lesbarer als einen Self-Join.


Christoph1972 - Fr 22.06.12 20:34

Vielen Dank euch beiden! Ich habe den Vorschlag von Ralf übernommen, nach dem ich das min auf max geändert habe, hat diese genau das geliefert, was ich brauchte. SQL finde ich wirklich gut, wenn man erst mal sieht wie etwas gemacht werden kann, dann erscheint es immer logisch. Mit etwas Übung kann man doch recht kreativ sein. Schade das ich nicht häufiger damit zu tun habe....