如何使用带有WHERE子句的IN和CASE检索特定数据。我试过这个:

时间:2018-05-15 13:21:13

标签: sql-server

如果用户选择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

2 个答案:

答案 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语句中的条件。