The Case
is returning syntax error while trying to set more than one condition to the query. The Store Procedure
takes a param @isAdmin
which I use later to select different data based on User Type.
Below is the query of the Store Procedure
SELECT orU.userName as userOrder,orf.OrderID
FROM App.orderF orf
Inner Join app.Users orU
On orf.LastUpdatedBy = orU.UserID
Where
-- ADDING THE CASE HERE
Case @isAdmn
WHEN 0 THEN LastUpdatedBy = @UserID AND SiteDataID=@SiteDataID
WHEN 1 THEN SiteDataID=@SiteDataID
-- ORDER BY IS NOT IN SIDE THE CASE
ORDER BY LastUpdatedDate DESC
The above query says there is an error near =
EDIT: Actual Query
SELECT orU.userName as userOrder,orf.OrderID, orf.OrderNumber, orf.TotalAmount, Convert(VARCHAR,orf.OrderDate,106) as OrderDate, orf.OrderStatus,orf.LastUpdatedBy as UserID
FROM App.OrderFinal orf
Inner Join app.Users orU
On orf.LastUpdatedBy = orU.UserID
Where
Case @isAdmn
WHEN 0 THEN LastUpdatedBy = @UserID AND SiteDataID=@SiteDataID
WHEN 1 THEN SiteDataID=@SiteDataID
ORDER BY LastUpdatedDate DESC
CodePudding user response:
You are missing the END
for the CASE
expression:
WHERE
CASE @isAdmn
WHEN 0 THEN LastUpdatedBy = @UserID AND SiteDataID = @SiteDataID
WHEN 1 THEN SiteDataID = @SiteDataID
END
Update: You have changed your tags from MySQL to SQL Server. SQL Server SQL doesn't have a boolean data type, so the CASE
expression result cannot be a boolean. SiteDataID = @SiteDataID
is a boolean value (true or false), and so is LastUpdatedBy = @UserID AND SiteDataID = @SiteDataID
. This does not work in SQL Server.
But usually you would not have a CASE
expression in WHERE
anyhow, because with CASE
you create a boolean expression check, which the WHERE
clause already is:
WHERE SiteDataID = @SiteDataID AND (@isAdmn = 1 OR LastUpdatedBy = @UserID)
CodePudding user response:
CASE does not control which lines of code run in this context. It returns a value. You need to use that value. You also need an END on it.
SELECT orU.userName as userOrder,orf.OrderID, orf.OrderNumber, orf.TotalAmount, Convert(VARCHAR,orf.OrderDate,106) as OrderDate, orf.OrderStatus,orf.LastUpdatedBy as UserID
FROM App.OrderFinal orf
Inner Join app.Users orU
On orf.LastUpdatedBy = orU.UserID
WHERE
LastUpdatedBy =
CASE @isAdmn
WHEN 0 THEN @UserID
WHEN 1 THEN LastUpdatedBy
END
AND SiteDataID = @SiteDataID
ORDER BY LastUpdatedDate DESC
Currently, your cases are doing the same thing, but that is what your code says and I'm sure not what your intent is. At any rate, this is how you use CASE in a WHERE clause.
Update: Your various screenshots and code aren't doing the same thing and I can't tell what your actual desired outcome is.
Update2: Code updated to reflect the clarified requirement.