max: SQL Abfrage mit "ist NULL und nicht NULL aber nicht Leerstring"

hi
also ich hab folgendes Problem

Mit folgender Abfrage bekomme ich alles zurückgeliefert was nicht Null und nicht leer ist

SELECT * FROM HitCounter WHERE ([Name] <> '') ORDER BY [PageName],[Name],[Function]

ich will jedoch Felder die Null sind zurückbekommen
ich will nur jene aussortieren die einen leerstring beinhalten

wenn ich jedoch mit
SELECT * FROM HitCounter WHERE ([Name] <> '') AND ([Name] IS NULL) ORDER BY [PageName],[Name],[Function]
abfrage bekomme ich gar nichts mehr zurückgeliefert

weiß jemand wie ich nur auf leerstrings filtern kann, so das diese nicht mehr mitgegeben werden

zusammenfassung:
Ich brauche einen Select befehl für:
Null darf da sein, Nicht null auch, nur ein Leerstring (sprich '') darf nicht dabei sein

schon mal danke im voraus
mfg, max

  1. Hi,

    WHERE ([Name] <> '') AND ([Name] IS NULL)

    eine Datenzelle kann nur entweder nichts (NULL) oder einen Leerstring beinhalten, nicht aber beides gleichzeitig. Verwechselst Du UND und ODER?

    Null darf da sein, Nicht null auch, nur ein Leerstring (sprich '') darf nicht dabei sein

    Äh, wenn Dir egal ist, ob der Wert NULL oder nicht ist, dann prüfe einfach nicht danach. Dein DBMS - welches immer das ist - müsste IMHO schon sehr defekt sein, wenn es NULL-Werte ausfiltert, ohne dass Du dies forderst.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      WHERE ([Name] <> '') AND ([Name] IS NULL)
      Dein DBMS - welches immer das ist - müsste IMHO schon sehr defekt sein, wenn es NULL-Werte ausfiltert, ohne dass Du dies forderst.

      Ähm, mit Verlaub, aber dann ist Oracle afaik ziemlich defekt:

      CREATE TABLE foo
      (
        bla NUMBER(2) NOT NULL,
        bar VARCHAR2(10)
      );

      INSERT INTO foo (bla, bar) VALUES(1,'');
      INSERT INTO foo (bla, bar) VALUES(3,NULL);
      INSERT INTO foo (bla, bar) VALUES(5,'TEST');

      SELECT bla, bar
        FROM foo
       WHERE bar <> ''

      liefert immer 0 Datensätze.

      SELECT bla, bar
        FROM foo
       WHERE bar IS NOT NULL

      hingegen schon.

      Grüße
        Klaus

      1. Hi,

        Ähm, mit Verlaub, aber dann ist Oracle afaik ziemlich defekt:
        CREATE TABLE foo
        (
          bla NUMBER(2) NOT NULL,
          bar VARCHAR2(10)
        );
        INSERT INTO foo (bla, bar) VALUES(1,'');
        INSERT INTO foo (bla, bar) VALUES(3,NULL);
        INSERT INTO foo (bla, bar) VALUES(5,'TEST');
        SELECT bla, bar
          FROM foo
        WHERE bar <> ''
        liefert immer 0 Datensätze.

        Dann ist wirklich was sehr defekt, wenn nicht mal 5, TEST zurückkommt...

        SELECT bla, bar
          FROM foo
        WHERE bar IS NOT NULL
        hingegen schon.

        hingegen was?

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
      2. Servus,

        WHERE ([Name] <> '') AND ([Name] IS NULL)
        Dein DBMS - welches immer das ist - müsste IMHO schon sehr defekt sein, wenn es NULL-Werte ausfiltert, ohne dass Du dies forderst.

        Ähm, mit Verlaub, aber dann ist Oracle afaik ziemlich defekt:

        CREATE TABLE foo
        (
          bla NUMBER(2) NOT NULL,
          bar VARCHAR2(10)
        );

        INSERT INTO foo (bla, bar) VALUES(1,'');
        INSERT INTO foo (bla, bar) VALUES(3,NULL);
        INSERT INTO foo (bla, bar) VALUES(5,'TEST');

        SELECT bla, bar
          FROM foo
         WHERE bar <> ''

        liefert immer 0 Datensätze.

        Seit wann ist Dein DB Server down???
        Es wird exakt ein Datensatz geliefert.
        Exakt die Anzahl derer die es betroffen hat.

        :-)) Tag tägliches überprüfen hat mir diee erkenntis gebracht.
        Lies doch mal Oracle for Admin

        Das hilft

        Gruss Matze

        1. Servus,

          Ich sollte wohl das Geheimis auflösen bevor dieser Thread im Archiv verschwindet.

          Seit wann ist Dein DB Server down???
          Es wird exakt ein Datensatz geliefert.
          Exakt die Anzahl derer die es betroffen hat.

          Je nachdem was man dem Result set entlockt, kommt eventuell nur
          ein Datensatz raus, der besagt: 2 Rows affected.
          Das ist das eine was man erfahren kann und in diesem besonderen Beispiel kommen sogar 2 Zeilen dabei raus denn NULL und '' wird von der DB gleich gewertet nämlich als NULL.
          Zumindest machen das die gängigsten so.

          Gruss Matze

  2. Hallo,

    so wirklich richtig verstehe ich Dein Problem nicht und versuche es mal wiederzugeben.

    Du möchtest alle Werte bekommen, ausser wenn eine Leerstring '' in einer Spalte ist.
    Oracle sagt zu sowas NULL.

    Im Klartext das ist NULL. Ein Leerstring wird von Oracle als NULL interpretiert und "filtert" es heraus.

    SELECT * FROM HitCounter WHERE ([Name] <> '') ORDER BY [PageName],[Name],[Function]

    ich will jedoch Felder die Null sind zurückbekommen
    ich will nur jene aussortieren die einen leerstring beinhalten

    wenn ich jedoch mit
    SELECT * FROM HitCounter WHERE ([Name] <> '') AND ([Name] IS NULL) ORDER BY [PageName],[Name],[Function]
    abfrage bekomme ich gar nichts mehr zurückgeliefert

    Ganz klar weil Du einmal nach "NULL" als '' und einmal NULL als NULL suchst.

    Ich gebe offen zu musste auch grad scharf überlegen ist aber wirklich so.

    Gruss Matze

    1. Sorry an alle,

      ja ich weiss sollte erst nochmals prüfen und dann abschicken.

      so wirklich richtig verstehe ich Dein Problem nicht und versuche es mal

      wiederzugeben.

      Du möchtest alle Werte bekommen, ausser wenn eine Leerstring '' in einer

      Spalte ist.

      Oracle sagt zu sowas NULL.

      Gerade geprüft,
      nicht nur Oracle Sybase und MSSQL verhalten sich gleich.
      Was nun mysql daraus macht weiss ich nicht.
      Ich vermute jedoch das gleiche.

      Im Klartext das ist NULL. Ein Leerstring wird von Oracle als NULL

      interpretiert und "filtert" es heraus.

      SELECT * FROM HitCounter WHERE ([Name] <> '') ORDER BY

      [PageName],[Name],[Function]

      Also Du stellst die Bedingung einmal es soll nicht NULL sein.
      {[Name] <> ''} und einmal die Bedingung es muss NULL sein.
      {([Name] IS NULL}

      ganz klar, dass da die DB keine Suchergebniss liefert.
      Denn NULL wäre theoretisch in Hexadizmal _ _ und '' ist hexadazimal
      ebenfalls _ _ jedoch z.B. eine Leerstelle ' ' wäre Hexadezimal z.B. 2 0 und
      das ist bestimmt keine NULL.

      Wenn Du nach einer Leerstelle suchst, dann musst du auch eine
      <Leerstelle> zwischen '<Leerstelle>' setzen damit es klappt.

      Gruss Matze