PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum ist IS NOT NULL falsch, wenn ein Zeilentyp überprüft wird?

Wie @Pavel bereitgestellt hat, ist die Prüfung <row-type> IS NOT NULL funktioniert nicht so wie du es erwartest. Es gibt TRUE zurück if (and only if) jeder einzelnen Spalte ist NOT NULL .

Testen Sie die spezielle Variable FOUND stattdessen (wie @Mike kommentiert):

CREATE OR REPLACE FUNCTION registration(wr text)
  RETURNS integer AS
$rL$
    ...

    SELECT * INTO rowt FROM email WHERE email_email = eml;

    IF FOUND THEN
       RAISE EXCEPTION 'email address, %, already registered.', eml;
    END IF;

    ...
$rL$ LANGUAGE plpgsql;

Oder Sie könnten Ihren Ausdruck im Test umkehren.

IF rowt IS NULL THEN
   -- do nothing
ELSE 
   RAISE EXCEPTION 'email address, %, already registered.' , eml;
END IF;

Jede vorhandene Zeile, die Sie finden würden, enthält mindestens eine Spalte, die NOT NULL ist , daher rowt IS NULL gibt nur TRUE zurück wenn nichts gefunden wird.

Verwandte Antworten mit weiteren Details:

  • Der IS NOT NULL-Test für einen Datensatz gibt nicht TRUE zurück, wenn die Variable gesetzt ist
  • NOT NULL-Einschränkung über eine Reihe von Spalten