Skip to main content
Ben Nadel at cf.Objective() 2009 (Minneapolis, MN) with: Simeon Bateman
Ben Nadel at cf.Objective() 2009 (Minneapolis, MN) with: Simeon Bateman ( @simBateman )

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

By on
Tags:

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):

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:

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:

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:

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.

Want to use code from this post? Check out the license.

Reader Comments

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.

I believe in love. I believe in compassion. I believe in human rights. I believe that we can afford to give more of these gifts to the world around us because it costs us nothing to be decent and kind and understanding. And, I want you to know that when you land on this site, you are accepted for who you are, no matter how you identify, what truths you live, or whatever kind of goofy shit makes you feel alive! Rock on with your bad self!
Ben Nadel