PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché IS NOT NULL è falso quando si controlla un tipo di riga?

Come fornito da @Pavel, il controllo <row-type> IS NOT NULL non funziona come sembri aspettarti. Restituisce TRUE if (e solo se) ogni singola colonna è NOT NULL .

Testare la variabile speciale FOUND invece (come ha commentato @Mike):

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;

Oppure potresti invertire la tua espressione nel test.

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

Qualsiasi riga esistente che potresti trovare contiene almeno una colonna che è NOT NULL , quindi rowt IS NULL restituisce solo TRUE se non viene trovato nulla.

Risposte correlate con maggiori dettagli:

  • Il test NON È NULLO per un record non restituisce TRUE quando è impostata la variabile
  • vincolo NOT NULL su un insieme di colonne