none
abhängig von einer bestimmten Bedingung den WHERE-Klausel bestimmen? RRS feed

  • Frage

  • Hallo,

    ich überprüfe bei der WHERE-Klausel in einer Select-Abfrage bestimmte Spalten an bestimmte Bedingungen.

    Möchte aber falls eine Spalte nicht leer ist auch mit überprüfen. Weiss aber nicht wie ich das machen soll?

    SELECT B.id,T.termindifferenz FROM dbo.benutzer AS B, dbo.tarif AS T WHERE 
    (B.id = T.zugeteiltAn 
    AND 
    (T.tarifBeginn >= CONVERT(DATETIME,'" + aktuelleDatum + "', 104)))

    Und falls T.tarifEnde nicht NULL oder leer ist soll diese Überprüfung auch gemacht werden:

    AND 
    (T.tarifEnde < CONVERT(DATETIME,'" + aktuelleDatum + "', 104)))


    Gruesse, NUNUI



    • Bearbeitet Nunui Freitag, 27. Januar 2017 16:18
    Freitag, 27. Januar 2017 16:16

Antworten

  • Hi,

    zum einen gäbe es eine einfache Methode, das zu bewerkstelligen.

    SELECT B.id,
           T.termindifferenz
    FROM   benutzer AS B,
           tarif    AS T
    WHERE  B.id = T.zugeteiltAn 
    AND            T.tarifBeginn             >= CONVERT( DATETIME, '" + aktuelleDatum + "', 104 )
    AND    ISNULL( T.tarifEnde, '20991231' ) <  CONVERT( DATETIME, '" + aktuelleDatum + "', 104 )
    

    In dem Fall werden der Vergleich immer durchgeführt, wenn tarifEnde aber NULL ist, wird für die Prüfung ein Standardwert (in dem Fall 31.12.2099) gesetzt.

    Wenn bei dir der Wert für "aktuelleDatum" niemals größer als 31.12.2099 sein wird, sollte das passen.

    Allerdings frage ich mich, ob deine Bedingung nicht falsch herum eingebaut ist.

    Du suchst ja bspw. alles, bei dem tarifBeginn >= 01.01.2017 ist und schränkst dann, wenn tarifEnde gesetzt ist, noch auf tarifEnde < 01.01.2017 ein.

    Meiner Meinung nach kann da nie ein Datensatz rauskommen. Umgekehrt macht es für mich mehr Sinn. Also tarifBeginn <= 01.01.2017 und tarifEnde > 01.01.2017

    Ansonsten gibt es natürlich noch die andere Option:

    SELECT B.id,
           T.termindifferenz
    FROM   benutzer AS B,
           tarif    AS T
    WHERE  B.id = T.zugeteiltAn 
    AND           T.tarifBeginn             >= CONVERT( DATETIME, '" + aktuelleDatum + "', 104 )
    AND    CONVERT( DATETIME, '" + aktuelleDatum + "', 104 ) < (
                         CASE
                             WHEN T.tarifEnde IS NULL THEN '20991231'
                             ELSE T.tarifEnde
                         END
                        )

    was aber letztendlich aufs gleiche rauskommen dürfte.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Nunui Freitag, 27. Januar 2017 20:35
    Freitag, 27. Januar 2017 18:15
    Moderator

Alle Antworten

  • Hi,

    zum einen gäbe es eine einfache Methode, das zu bewerkstelligen.

    SELECT B.id,
           T.termindifferenz
    FROM   benutzer AS B,
           tarif    AS T
    WHERE  B.id = T.zugeteiltAn 
    AND            T.tarifBeginn             >= CONVERT( DATETIME, '" + aktuelleDatum + "', 104 )
    AND    ISNULL( T.tarifEnde, '20991231' ) <  CONVERT( DATETIME, '" + aktuelleDatum + "', 104 )
    

    In dem Fall werden der Vergleich immer durchgeführt, wenn tarifEnde aber NULL ist, wird für die Prüfung ein Standardwert (in dem Fall 31.12.2099) gesetzt.

    Wenn bei dir der Wert für "aktuelleDatum" niemals größer als 31.12.2099 sein wird, sollte das passen.

    Allerdings frage ich mich, ob deine Bedingung nicht falsch herum eingebaut ist.

    Du suchst ja bspw. alles, bei dem tarifBeginn >= 01.01.2017 ist und schränkst dann, wenn tarifEnde gesetzt ist, noch auf tarifEnde < 01.01.2017 ein.

    Meiner Meinung nach kann da nie ein Datensatz rauskommen. Umgekehrt macht es für mich mehr Sinn. Also tarifBeginn <= 01.01.2017 und tarifEnde > 01.01.2017

    Ansonsten gibt es natürlich noch die andere Option:

    SELECT B.id,
           T.termindifferenz
    FROM   benutzer AS B,
           tarif    AS T
    WHERE  B.id = T.zugeteiltAn 
    AND           T.tarifBeginn             >= CONVERT( DATETIME, '" + aktuelleDatum + "', 104 )
    AND    CONVERT( DATETIME, '" + aktuelleDatum + "', 104 ) < (
                         CASE
                             WHEN T.tarifEnde IS NULL THEN '20991231'
                             ELSE T.tarifEnde
                         END
                        )

    was aber letztendlich aufs gleiche rauskommen dürfte.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Nunui Freitag, 27. Januar 2017 20:35
    Freitag, 27. Januar 2017 18:15
    Moderator
  • Hallo Stefan,

    VIELEN DANK! Und du hast vollkommen recht, die Bedingung habe falsch herum eingebaut gehabt :o)


    Gruesse, NUNUI


    • Bearbeitet Nunui Freitag, 27. Januar 2017 20:38
    Freitag, 27. Januar 2017 20:37