Re: MAX() of 0 records. - Mailing list pgsql-sql

From benoit@cyberdeck.net
Subject Re: MAX() of 0 records.
Date
Msg-id 200007070832.KAA23787@benoit.dagon.pdt
Whole thread Raw
In response to MAX() of 0 records.  (Paul McGarry <paulm@opentec.com.au>)
List pgsql-sql
> Hello,
> 
> I wish to perform the following query in a plsql function upon an
> update/insert/delete trigger:
> 
> UPDATE entry_stats 
> SET entry_maxprice=MAX(item_price) 
> FROM item 
> WHERE item.item_entry_id=NEW.item_entry_id
>   AND item.item_live = 't';
> 
> However there will be situations where there are no records for
> a given item_entry_id with item_live='t'. Currently when I try
> do update/insert a record so that this occurs I get the following
> error 'ERROR:  ExecutePlan: (junk) 'ctid' is NULL!' and the
> insert/update attempt is rolled back.
> 
> In this scenario I want entry_stats.entry_maxprice to be set to zero 
> (which is also the default value for that column if it's any help).
> 
> Is there a good way of going about this or should I just be wrapping
> the whole thing up in an
> ====
> IF (COUNT(*) FROM item 
>    WHERE item.item_entry_id=NEW.item_entry_id
>      AND item.item_live = 't')>0
> THEN
>  UPDATE ... =MAX() ...
> ELSE
>  UPDATE SET ... =0 ...
> END IF
> ====
> ?
> 
> Thanks
> 
> -- 
> Paul McGarry            mailto:paulm@opentec.com.au 
> Systems Integrator      http://www.opentec.com.au 
> Opentec Pty Ltd         http://www.iebusiness.com.au
> 6 Lyon Park Road        Phone: (02) 9878 1744 
> North Ryde NSW 2113     Fax:   (02) 9878 1755

I once had the same problem with an int4 column and solved it by using the 
function below :

CREATE FUNCTION "nulliszero" (int4 )
RETURNS int4 AS 
'SELECT 0 WHERE $1 IS NULL
UNION SELECT $1 WHERE $1 IS NOT NULL' LANGUAGE 'SQL';

Your request then would look like :
(...)SET entry_maxprice=nulliszero(MAX(item_price));
(...)

-Benoit





pgsql-sql by date:

Previous
From: Patrick Jacquot
Date:
Subject: Re: confused by select.
Next
From: brianb-pgsql@edsamail.com
Date:
Subject: Search for underscore w/ LIKE