Toon posts:

[SQL] Postgres function

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer een function te maken in PostgreSQL.
Het is de bedoeling dat er een query wordt uitgevoerd en het resultaat daarvan wordt gereturnd.
Er is echter wel een uitzondering hierop. Dat is dat er geen NULL mag worden gereturnd, maar in plaats van dat een 0.

Met het resultaat van de functie wordt een berekening uitgevoerd en die berekening levert altijd NULL op als 1 van de waarden in de berekening (dit geval een optelling) een NULL waarde bevat. Daarom wil ik op de plaats van de NULL values een 0 zetten.

Dit dacht ik te kunnen doen met een function (wordt geloof ik (in andere databases) ook wel stored procedure genoemd).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE FUNCTION eerderover_sp (integer,integer) RETURNS integer AS '
  DECLARE
    aantalseizoenen integer;
  BEGIN
    SELECT aantalseizoenen 
      FROM eerderover 
      WHERE seizoenid=$1 AND clublidid=$2;
    IF aantalseizoenen ISNULL THEN
      RETURN 0;
    ELSE
      RETURN aantalseizoenen;
    END IF;
  END;
' LANGUAGE 'sql';


Postgres komt dan met deze error, die gaat over integer in de regel onder DECLARE.
code:
1
ERROR:  syntax error at or near "integer" at character 34


Ik begrijp de error melding niet, want ik doe volgens mij precies hetzelfde als de Postgres manual. Of toch niet :?

[ Voor 4% gewijzigd door Verwijderd op 30-05-2005 14:29 ]


  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Doe niet zo moeilijk en gebruik gewoon COALESCE().

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ik weet niet of dit het is, maar toen ik laatst wat tabellen aan het maken was in Postgres kon ik alleen int2, int4 of int8 opgeven als datatype. Niet gewoon 'integer'.

[ Voor 5% gewijzigd door Varienaja op 30-05-2005 14:46 ]

Siditamentis astuentis pactum.


Verwijderd

Topicstarter
jochemd schreef op maandag 30 mei 2005 @ 14:46:
Doe niet zo moeilijk en gebruik gewoon COALESCE().
Dat werkt niet voor mijn situatie:

The COALESCE function returns the first of its arguments that is not null. Null is returned only if all arguments are null.

Ik wil ook 0 (in plaats van NULL) laten returnen als er geen resultaten worden opgehaald.

Verwijderd

Topicstarter
Varienaja schreef op maandag 30 mei 2005 @ 14:46:
Ik weet niet of dit het is, maar toen ik laatst wat tabellen aan het maken was in Postgres kon ik alleen int2, int4 of int8 opgeven als datatype. Niet gewoon 'integer'.
Dan krijg ik deze melding van Postgres:

ERROR: syntax error at or near "int4" at character 34

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op maandag 30 mei 2005 @ 15:03:
Ik wil ook 0 (in plaats van NULL) laten returnen als er geen resultaten worden opgehaald.
Dan voeg je toch een laatste argument 0 toe?
Varienaja schreef op maandag 30 mei 2005 @ 14:46:
Ik weet niet of dit het is, maar toen ik laatst wat tabellen aan het maken was in Postgres kon ik alleen int2, int4 of int8 opgeven als datatype. Niet gewoon 'integer'.
Vziw bestaan de aliassen 'integer', 'smallint' en 'bigint' al een tijdje (jaren) voor die veldtypen :)

[ Voor 45% gewijzigd door ACM op 30-05-2005 15:06 ]


  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Varienaja schreef op maandag 30 mei 2005 @ 14:46:
Ik weet niet of dit het is, maar toen ik laatst wat tabellen aan het maken was in Postgres kon ik alleen int2, int4 of int8 opgeven als datatype. Niet gewoon 'integer'.
Dat 'laatst' was zeker in het vorige millenium?
Verwijderd schreef op maandag 30 mei 2005 @ 15:04:
Dan krijg ik deze melding van Postgres:

ERROR: syntax error at or near "int4" at character 34
Dat klopt want je gebruikt de structuur van pl/pgSQL terwijl je je functie in SQL zegt te schrijven. SQL kent DECLARE, BEGIN en END niet.

Overigens blijf ik erbij dat je dit niet in een functie moet gaan oplossen. Wat is er tegen:
code:
1
2
3
4
5
6
7
SELECT MAX(x)
FROM (
SELECT COALESCE(aantalseizoenen,0) AS x
FROM eerderover 
WHERE seizoenid=$1 AND clublidid=$2
UNION
SELECT 0 AS x) a

  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Eigenlijk is het nog veel makkelijker:
code:
1
2
3
SELECT COALESCE(MAX(aantalseizoenen),0) AS aantalseizoenen
FROM eerderover 
WHERE seizoenid=$1 AND clublidid=$2

Verwijderd

Topicstarter
jochemd schreef op maandag 30 mei 2005 @ 16:05:
Eigenlijk is het nog veel makkelijker:
code:
1
2
3
SELECT COALESCE(MAX(aantalseizoenen),0) AS aantalseizoenen
FROM eerderover 
WHERE seizoenid=$1 AND clublidid=$2
Dat is precies wat ik nodig heb.
Bedankt!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op maandag 30 mei 2005 @ 16:52:
Dat is precies wat ik nodig heb.
Bedankt!
Let er op dat door de MAX er per definitie NULL (als er geen records waren), NULL (als alle records NULL waren) of een waarde uitkomt. Als je later een keer de MAX denkt te kunnen weglaten, dan snij je jezelf in de vingers doordat het eerste van de drie gevallen dat ik noem dan wegvalt :)
Pagina: 1