SQL использует оператор CASE в разделе WHERE IN
Можно ли использовать случай в том месте где in?
Что-то вроде этого:
DECLARE @Status VARCHAR(50);
SET @Status='published';
SELECT * FROM Product P
WHERE P.Status IN (CASE WHEN @Status='published' THEN (1,3)
WHEN @Status='standby' THEN (2,5,9,6)
WHEN @Status='deleted' THEN (4,5,8,10)
ELSE (1,3)
END)
Этот код дает ошибку: неправильный синтаксис рядом с ','.
Ответы
Ответ 1
Нет, вы не можете использовать case
и in
следующим образом. Но вы можете сделать
SELECT * FROM Product P
WHERE @Status='published' and P.Status IN (1,3)
or @Status='standby' and P.Status IN (2,5,9,6)
or @Status='deleted' and P.Status IN (4,5,8,10)
or P.Status IN (1,3)
Кстати, вы можете уменьшить это до
SELECT * FROM Product P
WHERE @Status='standby' and P.Status IN (2,5,9,6)
or @Status='deleted' and P.Status IN (4,5,8,10)
or P.Status IN (1,3)
поскольку or P.Status IN (1,3)
дает вам также все записи @Status='published' and P.Status IN (1,3)
Ответ 2
Я понимаю, что на это был дан ответ, но есть небольшая проблема с принятым решением. Он вернет ложные срабатывания. Легко исправить:
SELECT * FROM Products P
WHERE (@Status='published' and P.Status IN (1,3))
or (@Status='standby' and P.Status IN (2,5,9,6))
or (@Status='deleted' and P.Status IN (4,5,8,10))
or (@Status not in ('published','standby','deleted') and P.Status IN (1,2))
Скобки не нужны (хотя, возможно, легче прочитать, почему я включил их).
Ответ 3
select * from Tran_LibraryBooksTrans LBT left join
Tran_LibraryIssuedBooks LIB ON case WHEN LBT.IssuedTo='SN' AND
LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 when LBT.IssuedTo='SM'
AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 WHEN
LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1
ELSE 0 END`enter code here`select * from Tran_LibraryBooksTrans LBT
left join Tran_LibraryIssuedBooks LIB ON case WHEN LBT.IssuedTo='SN'
AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1 when
LBT.IssuedTo='SM' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN 1
WHEN LBT.IssuedTo='BO' AND LBT.LIBRARYTRANSID=LIB.LIBRARYTRANSID THEN
1 ELSE 0 END
Ответ 4
выберите * из Tran_LibraryBooksTrans LBT left join Tran_LibraryIssuedBooks LIB ON case WHEN LBT.IssuedTo = 'SN' AND LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1, когда LBT.IssuedTo = 'SM' И LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID ТОГДА 1 КОГДА LBT.IssuedTo = 'BO' И LBT.LIBRARYTRANSID = LIB.LIBRARYTRANSID THEN 1 ELSE 0 END
Ответ 5
возможно, вы можете попробовать этот путь
SELECT *
FROM Product P
WHERE (CASE
WHEN @Status = 'published' THEN
(CASE
WHEN P.Status IN (1, 3) THEN
'TRUE'
ELSE
FALSE
END)
WHEN @Status = 'standby' THEN
(CASE
WHEN P.Status IN (2, 5, 9, 6) THEN
'TRUE'
ELSE
'FALSE'
END)
WHEN @Status = 'deleted' THEN
(CASE
WHEN P.Status IN (4, 5, 8, 10) THEN
'TRUE'
ELSE
'FALSE'
END)
ELSE
(CASE
WHEN P.Status IN (1, 3) THEN
'TRUE'
ELSE
'FALSE'
END)
END) = 'TRUE'
Таким образом, если @Status = 'опубликовано', запрос будет проверять, является ли P.Status одним из 1 или 3, он вернет TRUE else 'FALSE'. Это будет соответствовать TRUE в конце
Надеюсь, что это поможет.
Ответ 6
Я считаю, что вы можете использовать оператор case в предложении where, вот как я это делаю:
Select
ProductID
OrderNo,
OrderType,
OrderLineNo
From Order_Detail
Where ProductID in (
Select Case when (@Varibale1 != '')
then (Select ProductID from Product P Where .......)
Else (Select ProductID from Product)
End as ProductID
)
Этот метод работал у меня снова и снова. попробуйте!