SQL COALESCE() Like ISNULL() On Steroids ... With Caveats

Posted August 4, 2006 at 5:04 PM

Tags: SQL

My main man, Rick O, just told me about the SQL statement COALESCE(). He had pointed out that my use of ISNULL() is not as universally accepted on DB platforms as COALESCE(). This function, as he explained, takes a list of items and returns the first one that is not NULL. After looking it up, I also see that if no values are non-null, then the function call itself returns NULL.

The main advantage here is that you can have multiple fall back values. As an example, let's say you wanted to return someone's phone number. If they had a business phone, mobile phone, and page, you could return which ever one was available (in order of importance):

 Launch code in new window » Download code as text file »

  • SELECT
  • COALESCE(
  • business_phone,
  • cell_phone,
  • pager
  • ) AS phone_number
  • FROM
  • contact

I think this is a very cool function. The one caveat is that you cannot mix data types in your list. This of course is not something that will come up very open, but, it's worth knowing about. Now, this doesn't always throw an error. Sometimes it works, sometimes it does not; it depends on where null values are found and which data types are being used.

For example, this does NOT throw an error:

 Launch code in new window » Download code as text file »

  • SELECT
  • COALESCE(
  • -- DB date/time field.
  • began_dating,
  •  
  • -- System date/time.
  • getDate(),
  •  
  • -- Text expression
  • 'sometime'
  • ) AS began_dating
  • FROM
  • girl

Even though 'sometime' is not of type date/time, no errors are thrown. In fact, you can force a null to be found and still no errors are thrown:

 Launch code in new window » Download code as text file »

  • SELECT
  • COALESCE(
  • -- Force null value.
  • NULL,
  •  
  • -- System date/time.
  • getDate(),
  •  
  • -- Text expression
  • 'sometime'
  • ) AS began_dating
  • FROM
  • girl

Works fine. However, if you switch the second and third arguments, such that the string value comes before the date value, it DOES throw an error:

 Launch code in new window » Download code as text file »

  • SELECT
  • COALESCE(
  • -- Force null value.
  • NULL,
  •  
  • -- Text expression
  • 'sometime',
  •  
  • -- System date/time.
  • getDate()
  • ) AS began_dating
  • FROM
  • girl

This throws the error:

Syntax error converting date/time from character string.

So again, this is rarely gonna be an issue, if ever, but still, good to know that there are errors sometimes and why they might seem random.

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Permalink  |  Other Searches  |  Print Page



Learning ColdFusion 9 - ColdFusion 9 tutorials, samples, examples, demos

Reader Comments

Oct 2, 2007 at 4:14 AM // reply »
1 Comments

Clearly the advantage of multiple fallbacks is not exclusive to coalesce.

Merely do ISNULL(A, ISNULL(B, ISNULL(C, D))) to choose between 4 values.


Aug 18, 2008 at 8:09 AM // reply »
1 Comments

Yeah but those close brackets can get way out of control ...


Post Comment  |  Ask Ben

Recent Blog Comments
Nov 20, 2009 at 11:32 PM
Five Months Without Hungarian Notation And I'm Loving It
I've used headless camel case for years for not only ColdFusion variables, but also SQL tables and fields... pretty much everything involving code. I also subscribe to the "don't abbreviate and clea ... read »
Nov 20, 2009 at 11:00 PM
Five Months Without Hungarian Notation And I'm Loving It
@Marcel, Yeah, I always err on the side of longer but more readable variable names. As for the camel casing of CF methods and the headless camel casing of custom items, I get around this by always ... read »
Nov 20, 2009 at 10:56 PM
Five Months Without Hungarian Notation And I'm Loving It
I use the following and love it: my.namespace.MyComponents.functionMethodsOrUDF() CONSTANT_VALUES_OR_PROPERTIES One thing I always try is to CamelCaseBuiltInColdFusionFunctions() so others can tell ... read »
Nov 20, 2009 at 5:38 PM
Learning ColdFusion 8: CFImage Part I - Reading And Writing Images
Hi Ben, Great article. I've been looking around to see if ColdFusion image engine can programatically create the following "wrap around" effect: http://www.creativepro.com/article/photoshop-s-she ... read »
Nov 20, 2009 at 5:35 PM
Maintaining ColdFusion Sessions Across SMS Text Message Requests Without Cookies
@Dave: I talked to Gert he suggested: <cfhttp method="get" url="http://{some cf website}" result="stuff" addtoken="yes" /> Note the addition of cfhttp attribute addtoken. That should persist y ... read »
Nov 20, 2009 at 5:23 PM
Maintaining ColdFusion Sessions Across SMS Text Message Requests Without Cookies
@Todd, Ahh, gotcha, yeah that makes sense. ... read »
Nov 20, 2009 at 5:17 PM
Maintaining ColdFusion Sessions Across SMS Text Message Requests Without Cookies
Ben, sorry if I didn't make this clear. You can make it work like that if you want, just put <cfset session.foo = 1> (and <cfset application.foo = 1>) in your OnRequestStart() and it reve ... read »