Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2012 Forums
 Transact-SQL (2012)
 t-sql 2012 coalesce

Author  Topic 

jassie
Constraint Violating Yak Guru

332 Posts

Posted - 2015-03-26 : 11:45:29
In t-sql 2012 there is the coalesce statement being used twice in a where clause. I do not understand what the where clause is doing. Thus can you explain what the where clause means in the following statement where coalesce is being used twice:

where coalesce(table1.status, table2.status) = 'A'

and coalesce(table1.code, 'UNV') in ('ABS', 'EUF', 'UNV', 'LEG', ILL', 'SUP')

Thus would you tell me what the above query means?

Ifor
Aged Yak Warrior

700 Posts

Posted - 2015-03-26 : 11:50:01
The basic logic is:

WHERE (table1.[status] = 'A' OR (table1.[status] IS NULL AND table2.[status] = 'A'))
AND
(table1.code IN ('ABS', 'EUF', 'UNV', 'LEG', 'ILL', 'SUP') OR table1.code IS NULL)

Go to Top of Page

gbritton
Master Smack Fu Yak Hacker

2780 Posts

Posted - 2015-03-26 : 11:52:09
The clause says:

Only include rows in the result set where

1.table1.status = 'A' or, if table1.status is null, then where table2.status = 'A'

and

2. table1.code = one of the following: 'ABS', 'EUF', 'UNV', 'LEG', ILL', 'SUP' or table1.code is null
Go to Top of Page

jassie
Constraint Violating Yak Guru

332 Posts

Posted - 2015-03-26 : 12:39:04
In my statement, "coalesce(table1.code, 'UNV') in ('ABS', 'EUF', 'UNV', 'LEG', ILL', 'SUP') there is the part of
'coalesce(table1.code, 'UNV')'. What is the 'UNV' being used for? I would think it is being used since it is listed, correct?
Go to Top of Page

gbritton
Master Smack Fu Yak Hacker

2780 Posts

Posted - 2015-03-26 : 12:40:59
'UNV' is the value to be used in the case where table1.code is null.

https://msdn.microsoft.com/en-CA/library/ms190349.aspx?f=255&MSPPError=-2147217396
Go to Top of Page

ScottPletcher
Aged Yak Warrior

550 Posts

Posted - 2015-03-26 : 15:19:49
The COALESCE function takes a list of values and returns the first one that is not NULL. With that in mind, we can easily determine what your specific statements do:

where coalesce(table1.status, table2.status) = 'A'
If table1.status is not null, it will be compared to 'A'. If table1.status is null, it will be ignored, and table2.status will be compared. If both are NULL, the result of the COALESCE is NULL, which be compared to 'A' and will never match (NULL is never "=" any value).

and coalesce(table1.code, 'UNV') in ('ABS', 'EUF', 'UNV', 'LEG', ILL', 'SUP')
If table1.code is not null, it will be checked against the IN list. If it is null, then 'UNV' will be checked against the list, since the literal 'UNV' will never itself be NULL. Btw, I'd suggest moving 'UNV' to first in the list since that's the default value; it might mildly speed up comparisons, esp. where there are a lot of NULL value in table1.code:
and coalesce(table1.code, 'UNV') in ('UNV', 'ABS', 'EUF', 'LEG', ILL', 'SUP')


Go to Top of Page

gbritton
Master Smack Fu Yak Hacker

2780 Posts

Posted - 2015-03-26 : 15:31:15
quote:
Originally posted by ScottPletcher

The COALESCE function takes a list of values and returns the first one that is not NULL. With that in mind, we can easily determine what your specific statements do:

where coalesce(table1.status, table2.status) = 'A'
If table1.status is not null, it will be compared to 'A'. If table1.status is null, it will be ignored, and table2.status will be compared. If both are NULL, the result of the COALESCE is NULL, which be compared to 'A' and will never match (NULL is never "=" any value).

and coalesce(table1.code, 'UNV') in ('ABS', 'EUF', 'UNV', 'LEG', ILL', 'SUP')
If table1.code is not null, it will be checked against the IN list. If it is null, then 'UNV' will be checked against the list, since the literal 'UNV' will never itself be NULL. Btw, I'd suggest moving 'UNV' to first in the list since that's the default value; it might mildly speed up comparisons, esp. where there are a lot of NULL value in table1.code:
and coalesce(table1.code, 'UNV') in ('UNV', 'ABS', 'EUF', 'LEG', ILL', 'SUP')






or simply where table1.code in ('UNV', 'ABS', 'EUF', 'LEG', ILL', 'SUP') or table1.code is null
Go to Top of Page
   

- Advertisement -