none
Wie kann ich ein SQL Statement automatisch negieren ? RRS feed

  • 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 !

    Mittwoch, 14. November 2012 13:58

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)

    Mittwoch, 14. November 2012 14:51

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)

    Mittwoch, 14. November 2012 14:34
  • 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 :-)

    Mittwoch, 14. November 2012 14:43
  • 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)

    Mittwoch, 14. November 2012 14:51
  • Hi Uwe,

    den Ansatz werde ich mal verfolgen. Probleme könnte es geben, wenn ich im Client wieder von der Ergebnisseite zurück zur Seite springe,in der die Parameter gesetzt werden. Ich melde mich wieder ;-)

    Danke !

    Viele Grüße

    Mittwoch, 14. November 2012 14:58
  • 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,
    Robert


    Robert 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.

    Mittwoch, 5. Dezember 2012 14:26
    Moderator
  • 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

    Montag, 10. Dezember 2012 20:22
  • 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

    Dienstag, 11. Dezember 2012 05:47
  • 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 !

    Dienstag, 11. Dezember 2012 08:51