PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que IS NOT NULL é falso ao verificar um tipo de linha?


Conforme fornecido pelo @Pavel, a verificação <row-type> IS NOT NULL não funciona como você parece esperar. Ele retorna TRUE se (e somente se) todas as colunas é NOT NULL .

Teste a variável especial FOUND em vez disso (como @Mike comentou):
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;

Ou você pode inverter sua expressão no teste.
IF rowt IS NULL THEN
   -- do nothing
ELSE 
   RAISE EXCEPTION 'email address, %, already registered.' , eml;
END IF;

Qualquer linha existente que você encontrar contém pelo menos uma coluna que é NOT NULL , portanto rowt IS NULL retorna apenas TRUE se nada for encontrado.

Respostas relacionadas com mais detalhes:
  • O teste IS NOT NULL para um registro não retorna TRUE quando a variável é definida
  • Restrição NOT NULL sobre um conjunto de colunas