Benutzer mit den meisten Antworten
Wie kann ich ein SQL Statement automatisch negieren ?

Frage
-
Hallo,
Ich möchte ein SQL Statement automatisch negieren können
Ein einfach Statement wäre zB.
Select * From Table where Column1 = "XY" AND Column2 >0 AND Column2 < 0 10
unter Verwendung von NOT wäre es dann
Select * From Table where Column1 = "XY" AND NOT( Column2 >0 AND Column2 < 0 10)
So weit so gut, manuell ist das kein Problem, automatisiert schon.
Hintergrund:
Ich habe eine Oberfläche mit der ich Abfragen generieren kann (s.o). Eine fertige Abfrage möchte ich durch Klick auf einen Button negieren können bzw. umgekehrt. Jedoch fehlt mir eine Art Anker zum Auffinden der richtigen Stelle.
Gerade in diesem speziellen Fall fällt es mir schwer. Für andere Abfragen z.B. mit between 0 AND 10 fällt es mir leicht. Nur Between darf ich hier nicht verwenden, denn das würde die 0 beinhalten.
Habt ihr irgendwelche Ideen ?
DANKE !
Antworten
-
Hallo Dru,
hier im Forum "Duzen" sich alle - das ist auch o.k. so. Du machst mich sonst älter als ich mich fühle :)
Da Du ja die bereits im Client die Anpassungen machst, wäre auch ein BETWEEN vom Client zu prüfen und gglfs. zu korrigieren.
Beispiel:
Am Client "würde" ein BETWEEN 0 and 10 "generiert" werden.
Anschließend mußt Du doch nur nach einem "BETWEEN 0 " suchen und das durch ein " BETWEEN 1 " ersetzen.Eine andere Möglichkeit - auf Seiten des SQL Servers - sehe ich ohne erheblichen Zeitaufwand nicht!
Uwe Ricken
MCITP Database Administrator 2005
MCITP Database Administrator 2008
MCITP Microsoft SQL Server 2008, Database Development
db Berater GmbH
http://www-db-berater.de
SQL Server Blog (german only)- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 5. Dezember 2012 14:25
Alle Antworten
-
Für andere Abfragen z.B. mit between 0 AND 10 fällt es mir leicht. Nur Between darf ich hier nicht verwenden, denn das würde die 0 beinhalten.
Und warum dann nicht BETWEEN 1 AND x - 1 :)
Nein - im Ernst...
Wo wird denn das SQL-Command generiert?
Ich verstehe nämlich noch nicht so ganz, wo das Problem ist.
Wenn Du es über den Client machen kannst, dann kannst du den String ja selbst parsen!Ist aber dennoch eine "Schweinearbeit"
Uwe Ricken
MCITP Database Administrator 2005
MCITP Database Administrator 2008
MCITP Microsoft SQL Server 2008, Database Development
db Berater GmbH
http://www-db-berater.de
SQL Server Blog (german only) -
Hallo, danke für die Hilfe.
Das Statement wird im Client generiert und bearbeitet.
ursprünglich war es so, dass das statement für "von" und "bis" werte mit
between VonValue AND BisValue
erstellt wurde. Dies ist auch weiterhin so, NUR nicht , wenn der Wert "von" == 0 ist.
between 0 AND BisValue
beinhaltet dann die 0, und dies darf nicht der Fall sein.
Deswegen die Variante mit >0 AND <= BisWert
DAs funktioniert ja auch alles ganz gut, mein Problem ist nur, dass man die obigen Abfragen auch nachträglic im Client ändern kann.
Parsen ist natürlich ne gute Idee, aber dazu muss ich wissen wonach ich suchen soll.
Bei beween kann ich danach suchen und ein replace mit "not between" machen.
Im zweiten Fall geht das ja nicht .
Ihr Vorschlag mit BETWEEN 1 AND x - 1 hab ich ehrlich gesagt gar nicht verstanden ...
trotzdem danke :-)
-
Hallo Dru,
hier im Forum "Duzen" sich alle - das ist auch o.k. so. Du machst mich sonst älter als ich mich fühle :)
Da Du ja die bereits im Client die Anpassungen machst, wäre auch ein BETWEEN vom Client zu prüfen und gglfs. zu korrigieren.
Beispiel:
Am Client "würde" ein BETWEEN 0 and 10 "generiert" werden.
Anschließend mußt Du doch nur nach einem "BETWEEN 0 " suchen und das durch ein " BETWEEN 1 " ersetzen.Eine andere Möglichkeit - auf Seiten des SQL Servers - sehe ich ohne erheblichen Zeitaufwand nicht!
Uwe Ricken
MCITP Database Administrator 2005
MCITP Database Administrator 2008
MCITP Microsoft SQL Server 2008, Database Development
db Berater GmbH
http://www-db-berater.de
SQL Server Blog (german only)- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 5. Dezember 2012 14:25
-
Hallo Dru_MS,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo Robert,
danke, hat alles gut geklappt. Allerdings kommt bei der Abfrage nocht nicht das raus was ich eigentlich haben möchte.
Wenn ich 5 Flächen haben
ID | Typ | FL_in_HA
Fläche 1 | Typ1 | 5 ha
Fläche 2 | Typ1 | 10 ha
Fläche 3 | Typ2 | 15 ha
Fläche 4 | Typ3 | 15 ha
Fläche 5 | Typ1 | 55 ha
und dann frage,
Select * from Table where not Typ = Typ1 AND FL_in_HA not between 10 and 60
Dann müsste mir die Abfrage doch
Fläche 1 | Typ1 | 5 ha
Fläche 3 | Typ2 | 15 ha
Fläche 4 | Typ3 | 15 ha
liefern, oder wie sehe ich das ?
Viele Grüße
-
Der erste Datensatz fällt raus, weil Du auf "not Typ = Typ1" filterst und die anderen beiden wegen "FL_in_HA not between 10 and 60" und das per AND verknüpft.
Um das Ergebnis zu erhalten, müsstest Du so filtern:
Select * from Table where (Typ = 'Typ1' AND FL_in_HA NOT between 10 and 60) OR (NOT Typ = 'Typ1' AND FL_in_HA between 10 and 60)
Olaf Helper
Blog Xing- Als Antwort vorgeschlagen Robert BreitenhoferModerator Dienstag, 11. Dezember 2012 07:58
-
Hi,
danke für die Antwort.
Ich hab gestern noch ein wenig getestet und bin dann auch aufs OR gekommen, allerdings formuliere ich das etwas anders :
Select * from Table where NOT(Typ = 'Typ1') OR FL_in_HA NOT between 10 and 60)
Wie wäre es denn sauber formuliert, wenn man mehrere Fragen kombinieren möchte ?
Etwa so ?
SELECT * FROM Table WHERE (NOT (Typ = 'Typ1')) AND (FL_IN_HA BETWEEN 0.5 AND 1) OR (NOT (Typ = 'Typ2')) AND (FL_in_HA BETWEEN 0 AND 0.5)
Also alle außer (Typ1 zwischen 0.5 und 1) UND (Typ2 zwischen 0 und 0.5)
Danke für eure Hilfe !