MYSQL, auf Empty Set prüfen.



  • Hallo,
    erstmal das Query:

    select time from log where host = host_ and time > t1 and time < endDate and service = 'DOWN' and type like '%HOST%' limit 1 into t1;
    

    Das ganze spielt sich in einer Schleife ab und es kann vorkommen das das Query ein Empty Set zurückgibt. Allerdings wird die Variable t1 nicht wie von mir erwarten genullt oder auf nichts gesetzt, sondern behält den vorherigen Wert bei.

    Mein versuch das ganze abzufangen und zu NULLen war leider nicht erfolgreich.

    select if(exists(time), time, NULL) from log where nagioslog.host = host_ and time > t1 and time < endDate and service = 'DOWN' and type like '%HOST%' limit 1;
    

    Kann mir da jemand weiterhelfen?

    MfG gosha16



  • Also erstmal würd ich das ganze so schreiben

    select @t1 = (select time from log where host = host_ and time > t1 and time < endDate and service = 'DOWN' and type like '%HOST%' limit 1);
    

    Oder evtl. gleich

    --             /-- oder min() oder was auch immer
    --            v
    select @t1 = max(time) from log where host = host_ and time > t1 and time < endDate and service = 'DOWN' and type like '%HOST%';
    

    Nur wegen Standard-SQL und so

    Und dann... wieso schreibst du nicht einfach ein SET @t1 = NULL; davor, und prüfst dann gegen NULL ?
    Das time Feld wird ja wohl hoffentlich NOT NULL sein, und die Query 2x auszuführen nur um zu sehen ob das Result-Set leer ist wäre vermutlich etwas wasteful.

    Natürlich kannst du die Variable t1 dann nicht mehr als Filterbedingung verwenden, sondern musst zwei getrennte Variablen dafür verwenden. Das würde die Sacher mMn. sogar übersichtlicher machen, wäre also eher was gutes...



  • ps:
    Eventuell auch andenken:
    Erstmal alles was den Filterbedingungen entspricht in einen Temp-Table kopieren, und den dann zeilenweise durchgehen.

    Cursor-Schleifen sind zwar bäh und langsam, aber immer noch besser ein INSERT-SELECT über 1000 Zeilen + Cursor-Schleife über diese 1000 Zeilen als 1000 SELECTs.



  • Ich hab t1 NULL gesetzt und verwende nun zusätzlich eine temp Variable.
    Funktioniert nun alles bestens.

    Vielen dank! 🙂


Anmelden zum Antworten