sql >> Database >  >> RDS >> PostgreSQL

IS NOT NULL-test voor een record retourneert niet TRUE wanneer variabele is ingesteld

Ik zie twee mogelijke redenen, waarom ...

Geen van deze verhogingen verschijnt in mijn berichtenlogboek

Niet ingelogd

Ten eerste een NOTICE wordt normaal gesproken niet naar het databaselogboek geschreven met standaardinstellingen. Ik citeer hier de handleiding:

log_min_messages (enum )

Bepaalt welke berichtniveaus naar het serverlogboek worden geschreven. Geldige waarden zijn DEBUG5 , DEBUG4 , DEBUG3 , DEBUG2 , DEBUG1 , INFO , NOTICE , WARNING , ERROR , LOG , FATAL , en PANIC . (...)
De standaard is WAARSCHUWING . Merk op dat LOG heeft hier een andere rang dan in client_min_messages .

Vetgedrukte nadruk van mij. Let ook op de verschillende standaard (NOTICE ) voor client_min_messages (vorig item in de handleiding).

Ongeldige test

Ten tweede, overweeg hoe een rij-expressie wordt geëvalueerd. Een test row_variable IS NULL retourneert TRUE als (en alleen als) elk afzonderlijk element is NULL . Gegeven het volgende voorbeeld:

SELECT (1, NULL) IS NULL AS a     -- FALSE
      ,(1, NULL) IS NOT NULL AS b -- also FALSE

Beide expressies retourneren FALSE . Met andere woorden, een rij (of record) variabele (1, NULL) is geen van beide NULL , noch is het NOT NULL . Daarom mislukken uw beide tests.

-> SQLfiddle met meer details.

Meer details, uitleg, links en een mogelijke toepassing voor dit gedrag in een CHECK beperking in dit gerelateerde antwoord:
NOT NULL beperking over een reeks kolommen

U kunt zelfs een recordvariabele toewijzen met NULL (rec := NULL ), wat ertoe leidt dat elk element NULL is - als het type een bekend rijtype is. Anders hebben we te maken met een anoniem record en is de structuur niet gedefinieerd en heeft u om te beginnen geen toegang tot elementen. Maar dat is niet het geval met een rowtype zoals in jouw voorbeeld (wat altijd bekend is).

Oplossing:FOUND

Wat is de juiste manier om te testen of je een rij hebt ontvangen van een SELECT * INTO ?

U moet er rekening mee houden dat de rij NULL kan zijn, zelfs als deze is toegewezen. De query zou heel goed een aantal NULL-waarden kunnen hebben geretourneerd (als de tabeldefinitie in uw query NULL-waarden toestaat). Zo'n test zou per definitie onbetrouwbaar zijn.

Er is een eenvoudige en veilige aanpak. Gebruik GET DIAGNOSTICS ... of (indien van toepassing) de speciale variabele FOUND :

SELECT * FROM my_table WHERE owner_id = 6 INTO my_var;

IF NOT FOUND THEN
   RAISE NOTICE 'Query did not return a row!';
END IF;

Details in de handleiding.




  1. 5 MySql nuttige vragen tijdens projectontwikkeling

  2. Fouten in SQL Server tijdens het importeren van CSV-bestand ondanks dat varchar(MAX) voor elke kolom wordt gebruikt

  3. Top 9 databasebeheersystemen voor Joomla's sjablonen

  4. Beperkingen tijdelijk uitschakelen (MS SQL)