Re: CASE

From: Greg Stark <gsstark(at)mit(dot)edu>
To: "Victor Yegorov" <viy(at)pirmabanka(dot)lv>
Cc: Rudi Starcevic <rudi(at)oasis(dot)net(dot)au>, pgsql-sql(at)postgresql(dot)org
Subject: Re: CASE
Date: 2003-04-08 12:06:15
Message-ID: 877ka519e0.fsf@stark.dyndns.tv
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql


"Victor Yegorov" <viy(at)pirmabanka(dot)lv> writes:

> ...COALESCE( MAX(e.edate),'2003-01-01')...
>
> MAX(e.edate): will return date type (just a guess)
> '2003-01-01': will return char type (or varchar, doesn't matter).

No, 'xyz' in postgres isn't necessarily a string constant, it's an untyped
constant that the parser decides the type of based on context. In this case it
gets decided based on the other return values of the coalesce/case.

Notice the types chosen in this query:

db=# explain select * from t where t_start = coalesce(now(),'2003-01-01') ;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on t (cost=0.00..48223.40 rows=226 width=423)
Filter: ((t_start)::timestamp with time zone = CASE WHEN (now() IS NOT NULL) THEN now() WHEN ('2003-01-01' IS NOT NULL) THEN '2003-01-01 00:00:00-05'::timestamp with time zone ELSE NULL::timestamp with time zone END)
(2 rows)

However, I suspect for some reason postgres is doing a string comparison in
your case. I don't understand why. Note that now() isn't a date, it's a
"timestamp with time zone", but I don't think that should be a problem.
Try checking what types it uses in the plan for:

EXPLAIN SELECT *
FROM e
WHERE (CASE WHEN coalesce(max(e.edate),'2003-01-01') >= now()::date
THEN 'events'
ELSE 'noevents'
END
) = 'events';

Also, the standard date format should still sort correctly as alphanumeric,
so I'm curious what you see when you do:

SELECT now();

--
greg

In response to

  • Re: CASE at 2003-04-08 09:40:39 from Victor Yegorov

Responses

  • Re: CASE at 2003-04-08 12:13:46 from Victor Yegorov
  • Re: CASE at 2003-04-08 14:30:37 from Tom Lane

Browse pgsql-sql by date

  From Date Subject
Next Message Victor Yegorov 2003-04-08 12:13:46 Re: CASE
Previous Message Ramesh PAtel 2003-04-08 11:22:09 Problem about Triggers and Function