Thomaier: WHERE: von mehreren Aussagen darf nur eine wahr sein

Hallo,
ich möchte gerne in meiner WHERE-Klausel verschiedene Aussagen haben, von denen aber nur eine wahr sein darf. Für sich einzeln wahr wären in diesem Fall z.B.

  
table.eins = 1  
table.zwei = 2  
table.drei = 3

WHERE soll insgesamt nur wahr sein, wenn ausschließlich EINE der Einzelaussagen wahr ist. Für oben beschriebene Vergleiche könnte das ganze noch anhand aller möglichen Kombinationen beschrieben werden:

WHERE (table.eins = 1 AND table.zwei != 2 AND table.drei != 3) OR (table.eins != 1 AND table.zwei = 2 AND table.drei != 3)  
OR (table.eins != 1 AND table.zwei != 2 AND table.drei = 3)

Wären es nur 3 Werte, würde ich es so machen, da es aber deutlich über ein Dutzend sein können bei mehreren hunderttausenden Datensätzen, wäre mir die einzelne Überprüfung aller möglichen Kombinationen zu aufwendig.

Wie kann die Abfrage optimiert werden?

Danke,
Thomaier

  1. In MS-SQL würd ich sowas machen:
    WHERE ( (CASE WHEN table.eins = 1 THEN 1 ELSE 0 END) +
            (CASE WHEN table.zwei = 2 THEN 1 ELSE 0 END) +
            (CASE WHEN table.drei = 3 THEN 1 ELSE 0 END) = 1)
    Vielleicht findest du eine Umsetzug davon für deine DB.

    1. Hallo Encoder,
      danke für die schnelle Antwort. Ich nutze MySQL 5 und es scheint mit IF zu funktionieren

      WHERE ( (IF table.eins = 1, 1, 0) +
              (IF table.zwei = 2, 1, 0) +
              (IF table.drei = 3, 1, 0) = 1)

      Thomaier

  2. Moin!

    ich möchte gerne in meiner WHERE-Klausel verschiedene Aussagen haben, von denen aber nur eine wahr sein darf.

    Du suchst XOR als logische Verknüpfung.

    - Sven Rautenberg

    1. echo $begrüßung;

      » ich möchte gerne in meiner WHERE-Klausel verschiedene Aussagen haben, von denen aber nur eine wahr sein darf.
      Du suchst XOR als logische Verknüpfung.

      Wie XORt man denn mehr als zwei Parameter?

      echo "$verabschiedung $name";

      1. Moin!

        »» » ich möchte gerne in meiner WHERE-Klausel verschiedene Aussagen haben, von denen aber nur eine wahr sein darf.
        »» Du suchst XOR als logische Verknüpfung.

        Wie XORt man denn mehr als zwei Parameter?

        Wie ANDet oder ORt man denn mehr als zwei Parameter? :)

        - Sven Rautenberg

        1. Hallo Sven,

          »» » ich möchte gerne in meiner WHERE-Klausel verschiedene Aussagen haben, von denen aber nur eine wahr sein darf.
          »» Du suchst XOR als logische Verknüpfung.

          Wie XORt man denn mehr als zwei Parameter?

          Wie ANDet oder ORt man denn mehr als zwei Parameter? :)

          Nix für ungut: Wenn Du Dir eine Wahrheitstabelle für A xor B xor C aufstellst wirst Du sehen, dass das nicht äquivalent zur Aussage "nur 1 von A, B oder C" ist.

          Viele Grüße,
          Christian

          1. Moin!

            Hallo Sven,

            »» Wie ANDet oder ORt man denn mehr als zwei Parameter? :)

            Nix für ungut: Wenn Du Dir eine Wahrheitstabelle für A xor B xor C aufstellst wirst Du sehen, dass das nicht äquivalent zur Aussage "nur 1 von A, B oder C" ist.

            Ja, so ein Mist! :) Denkfehler.

            - Sven Rautenberg