sql >> Database >  >> RDS >> PostgreSQL

Waarom is IS NOT NULL false bij het controleren van een rijtype?

Zoals @Pavel aangaf, is het vinkje <row-type> IS NOT NULL werkt niet zoals je lijkt te verwachten. Het retourneert TRUE als (en alleen als) elke kolom is NOT NULL .

Test de speciale variabele FOUND in plaats daarvan (zoals @Mike heeft gereageerd):

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;

Of je zou je uitdrukking in de test kunnen omkeren.

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

Elke bestaande rij die u zou vinden, bevat ten minste één kolom die NOT NULL is , daarom rowt IS NULL retourneert alleen TRUE als er niets wordt gevonden.

Gerelateerde antwoorden met meer details:

  • IS NOT NULL-test voor een record geeft geen TRUE als variabele is ingesteld
  • NOT NULL-beperking voor een reeks kolommen


  1. Tool voor het scripten van tabelgegevens

  2. Hoe verander ik de standaardtaal voor SQL Server?

  3. Hoe kan ik het SQL-uitvoeringsplan in Oracle zien?

  4. PostgreSQL kan geen transacties beginnen/beëindigen in PL/pgSQL