Reputation: 6505
I have a really big stored Procedure which I cannot share but I am only having trouble with implementing a dynamic where clause, which already has 7 ANDs. Within the last 'And' of the WHERE clause, I need to check a parameter passed to the stored procedure and construct the 'And' accordingly. Basically, a user can pass in either Buyer or seller or an empty string (indicating to use both), to the stored procedure. Algorithm needed:
SELECT blah blah blah
FROM multiple joins, left outer joins blah
WHERE
(1st clause) AND
(2nd clause) AND
(3rd clause) AND
(4th clause) AND
(5th clause) AND
(6th clause) AND
(7th clause) AND
(need to check paramater passed in and fill in this and accordingly....
Basically in JS terms:
if (parameter ='buyer'){
B.S_FNAME LIKE '%' + @Name + '%' OR
B.S_SNAME LIKE '%' + @Name + '%'
}
else if (parameter = 'seller'){
S.S_FNAME LIKE '%' + @Name + '%' OR
S.S_SNAME LIKE '%' + @Name + '%'
}
else{
B.S_FNAME LIKE '%' + @Name + '%' OR
S.S_FNAME LIKE '%' + @Name + '%' OR
B.S_SNAME LIKE '%' + @Name + '%' OR
S.S_SNAME LIKE '%' + @Name + '%'
}
)
My attempt was as follows where @CliType is the parameter passed in:
AND (CASE
WHEN @CliType = 'Buyer' THEN
B.S_FNAME LIKE '%' + @Name + '%' OR
B.S_SNAME LIKE '%' + @Name + '%'
WHEN @CliType = 'Seller' THEN
S.S_FNAME LIKE '%' + @Name + '%' OR
S.S_SNAME LIKE '%' + @Name + '%'
WHEN @CliType = '' THEN
B.S_FNAME LIKE '%' + @Name + '%' OR
S.S_FNAME LIKE '%' + @Name + '%' OR
B.S_SNAME LIKE '%' + @Name + '%' OR
S.S_SNAME LIKE '%' + @Name + '%'
END)
But this gives me error lines under the first LIKE and the second WHEN. I'm using sql server 2008 and have not much experience with it. Any help appreciated
Upvotes: 0
Views: 805
Reputation: 8693
You can parse the parameter and build a string variable that you plug into your select statement.
if @CliType = 'Buyer'
THEN @WhereVariable = B.S_FNAME LIKE '''%''' + @Name + '''%''' OR...'
else if @CliType = 'Seller' then ...
Then just plug that into a string that ends up being your full query, and execute it with sp_executesql
Upvotes: 0
Reputation: 1581
Please try this, hope its useful.
DECLARE @CliType VARCHAR(100);
DECLARE @Name VARCHAR(100);
DECLARE @TableBuyer TABLE (ID INT,
S_FNAME VARCHAR(100),
S_SNAME VARCHAR(100));
DECLARE @TableSeller TABLE (ID INT,
S_FNAME VARCHAR(100),
S_SNAME VARCHAR(100));
--Assign your input parameters here
SET @CliType = 'Buyer' --NULL
SET @Name = 'Daniella'
INSERT INTO @TableBuyer
SELECT '1','Bryan', 'Greenberg' UNION ALL
SELECT '2','Channing', 'Tatum' UNION ALL
SELECT '3','Paul', 'William' UNION ALL
SELECT '4','Eric', 'Bana' UNION ALL
SELECT '5','James', 'Lafferty' UNION ALL
SELECT '6','Wentworth', 'Miller'
INSERT INTO @TableSeller
SELECT '1','Dianna', 'Agron' UNION ALL
SELECT '2','Malin', 'Akerman' UNION ALL
SELECT '3','Christina', 'Aguilera' UNION ALL
SELECT '4','Jessica', 'Alba' UNION ALL
SELECT '5','Krista', 'Allen' UNION ALL
SELECT '6','Daniella', 'Alonso'
SELECT b.ID,b.S_FNAME,b.S_SNAME,s.ID,s.S_FNAME,s.S_SNAME
FROM @TableBuyer b
JOIN @TableSeller s
ON b.ID=s.ID
WHERE (@CliType = 'Buyer'
AND (B.S_FNAME LIKE '%' + @Name + '%'
OR B.S_SNAME LIKE '%' + @Name + '%'))
OR (@CliType = 'Seller'
AND (S.S_FNAME LIKE '%' + @Name + '%'
OR S.S_SNAME LIKE '%' + @Name + '%'))
OR (ISNULL(@CliType, '') = ''
AND (B.S_FNAME LIKE '%' + @Name + '%'
OR S.S_FNAME LIKE '%' + @Name + '%'
OR B.S_SNAME LIKE '%' + @Name + '%'
OR S.S_SNAME LIKE '%' + @Name + '%'));
Upvotes: 2
Reputation: 2130
Thats not how the Case Statement works. The basic idea is to use a similar syntax for each condition you are trying to check.
AND (CASE
WHEN @CliType = 'Buyer' THEN
B.S_FNAME WHEN @CliType = 'Seller' THEN
S.S_FNAME WHEN @CliType = '' THEN
B.S_FNAME END LIKE '%' + @Name + '%' )
OR..
Upvotes: 0