Unfortunately, this doesn't work, even when the spelling errors are
corrected. The predicates
COALESCE(criteriaA, criteriaB) IS NULL
and
COALESCE(criteriaA,criteriaB IS NOT NULL
are not equivalent to the predicates
criteriaA IS NULL AND criteriaB IS NULL
and
criteriaA IS NULL OR criteriaB IS NULL
as can be seen from the errors raised here:
CREATE TABLE Foobar (
criteriaA int,
criteriaB char
)
INSERT INTO Foobar values (null,'A')
GO
CREATE PROCEDURE p (
@param int
) AS
SELECT *
FROM Foobar
WHERE CASE
WHEN @param = 1 -- both null
AND COALESCE (criteriaA, criteriaB) IS NULL
THEN 1
WHEN @param = 2 -- no nulls
AND criteriaA IS NOT NULL
AND criteriaB IS NOT NULL
THEN 1
WHEN @param = 3 -- one null
AND COALESCE (criteriaA, criteriaB) IS NOT NULL
THEN 1 ELSE 0 END = 1;
GO
EXEC p 1
GO
EXEC p 3
GO
DROP PROC p
DROP TABLE Foobar
The solution Hugo gave works fine.
Steve Kass
Drew University
[quoted text, click to view] Joe Celko wrote:
>Here is an example of how to use a CASE expression for complex logic.
>
>SELECT *
> FROM Foobar
> WHERE CASE
> WHEN @param = 1 -- both null
> AND COLEASE (criteraA, criteriaB) IS NULL
> THEN 1
> WHEN @param = 2 -- no nulls
> AND criteriaA IS NOT NULL
> AND criteriaB IS NOT NULL
> THEN 1
> WHEN @param = 3 -- one null
> AND COALESCE (criteriaA, criteriaB) IS NOT NULL
> THEN 1 ELSE 0 END = 1;
>
>--CELKO--
>Please post DDL, so that people do not have to guess what the keys,
>constraints, Declarative Referential Integrity, datatypes, etc. in your
>schema are. Sample data is also a good idea, along with clear
>specifications.
>
>
>*** Sent via Developersdex
http://www.developersdex.com ***
>Don't just participate in USENET...get rewarded for it!
>