Re: Using CASE with a boolean value - Mailing list pgsql-novice

From Tom Lane
Subject Re: Using CASE with a boolean value
Date
Msg-id 13268.1022264657@sss.pgh.pa.us
Whole thread Raw
In response to Using CASE with a boolean value  (Tom Ansley <tansley@law.du.edu>)
Responses Re: Using CASE with a boolean value
List pgsql-novice
Tom Ansley <tansley@law.du.edu> writes:
> CASE booking.quiz
>     WHEN booking.quiz=false THEN 'No'
>     WHEN booking.quiz=true THEN 'Yes'
>     ELSE 'No'
> END

You seem to be confused about the two forms of CASE.  You can either
write boolean WHEN conditions or provide a value to be compared against
a series of alternative match values.  What you have here is an unholy
mixture of both, which would never have been accepted at all if
booking.quiz had not chanced to be a boolean value.  The system will
take it as (booking.quiz = (booking.quiz=false)), etc.  I'm far too lazy
to work out the exact implications of that, but it's probably not what
you want.

I'd write a CASE on a boolean value like this:

CASE WHEN booking.quiz THEN 'Yes' ELSE 'No' END

or if I wanted to distinguish UNKNOWN (NULL) as

CASE booking.quiz
  WHEN true THEN 'Yes'
  WHEN false THEN 'No'
  ELSE 'Unknown'
END

Or you could write it as

CASE
  WHEN booking.quiz=true THEN 'Yes'
  WHEN booking.quiz=false THEN 'No'
  ELSE 'Unknown'
END

which is actually what the system will expand the previous example into.
But writing it out seems un-idiomatic to me.  (I always look at 'boolean
= TRUE' kinds of tests as the mark of a beginner programmer who hasn't
quite absorbed the notion of a boolean value...)

            regards, tom lane

pgsql-novice by date:

Previous
From: Manfred Koizar
Date:
Subject: Re: query problem - get count in related table
Next
From: Tom Ansley
Date:
Subject: Re: Using CASE with a boolean value