如果用户选择Northeast(37),则输出如下所示: Output 这是我的疑问:
SELECT st.STATE,*FROM Pulses_tbl_Transition_log l
INNER JOIN Pulses_mst_state st ON st.id = l.state_id
WHERE state_id IN CASE
WHEN state_id = 37
THEN (
17
,1
,16
)
ELSE '37'
END
答案 0 :(得分:0)
SQL的查询结构是错误的,除非你使用PLSQL。 when条件只能应用于select语句结果,以根据条件过滤和更改特定结果。 请参阅此前的答案 Case in Select Statement
答案 1 :(得分:0)
如果用户选择,那么我想你使用一个变量。
但是CASE只返回一个值 但这已经足够了,因为只需要检查1个值。
示例:
DECLARE @stateId INT = 37;
SELECT st.STATE, l.*, st.*
FROM Pulses_tbl_Transition_log l
JOIN Pulses_mst_state st ON (st.id = l.state_id)
WHERE
(CASE
WHEN @stateId NOT IN (37, 38) AND l.state_id = @stateId THEN 1
WHEN @stateId = 37 AND l.state_id IN (1, 16, 17) THEN 2
WHEN @stateId = 38 AND l.state_id IN (11, 28) THEN 3
END) > 0;
使用OR也是一种选择。
DECLARE @stateId INT = 37;
SELECT st.STATE, l.*, st.*
FROM Pulses_tbl_Transition_log l
JOIN Pulses_mst_state st ON (st.id = l.state_id)
WHERE
(
(l.state_id = @stateId AND @stateId NOT IN (37, 38)) OR
(l.state_id IN (1, 16, 17) AND @stateId = 37) OR
(l.state_id IN (11, 28) AND @stateId = 38)
);
请注意在OR之前评估AND。 Reference
因此,使用肠胃外给药有助于避免逻辑上的误解。
例如,猜猜这个示例SQL的结果是什么:
select
(case when 1=1 OR 2=2 AND 3=0 then 'true' else 'false' end) as r1,
(case when 1=1 OR (2=2 AND 3=0) then 'true' else 'false' end) as r2,
(case when (1=1 OR 2=2) AND 3=0 then 'true' else 'false' end) as r3;
如果state_id上有索引,那么出于性能原因,使用Dynamic SQL代替它可能是值得的。并根据变量的值更改动态SQL语句中的条件。