将CASE与WHERE结合使用以指定要过滤的不同列

时间:2015-07-02 18:46:44

标签: sql sql-server tsql where-clause

这可能不是有效的SQL,但我正在尝试这样做:

SELECT * 
FROM tablename
WHERE 
    (CASE @ScoreType 
        WHEN 1 THEN score1 
        WHEN 2 THEN score2 
        ELSE score3 END) >= @Score

基本上,我正在尝试按WHERE子句中的不同列进行过滤,具体取决于@ScoreType的值。我是否正确地猜测我的方法无效?如果是这样,那么正确的方法是什么?

编辑:抱歉,我在简化要在此处发布的查询时意外省略了end。实际查询确实有end。查询本身运行正常,但结果不符合预期。事实证明这个问题在其他地方。我怀疑是WHERE条款,因为我以前从未尝试过这样的事情,并且不确定它是否是有效的SQL。

4 个答案:

答案 0 :(得分:1)

这应该可行吗?

SELECT * 
FROM tablename
WHERE 
    (CASE @ScoreType 
        WHEN 1 THEN score1 
        WHEN 2 THEN score2 
        WHEN 3 THEN score3
      END) >= @Score

编辑:

我认为问题是:你忘记了案件的end

答案 1 :(得分:0)

你想要这样的东西:

SELECT * 
FROM tablename
WHERE (@ScoreType = 1 AND score1 >= @Score) OR 
      (@ScoreType = 2 AND score2 >= @Score) OR
      score3 >= @score

修改

正如@HABO指出的那样,上面与原始代码略有不同。替换为:

SELECT * 
FROM tablename
WHERE (@ScoreType = 1 AND score1 >= @Score) OR 
      (@ScoreType = 2 AND score2 >= @Score) OR
      (@ScoreType <> 1 AND @ScoreType  <> 2 AND score3 >= @score) 

答案 2 :(得分:0)

这应该有效:

SELECT * 
FROM tablename
WHERE @Score <=
    CASE @ScoreType 
        WHEN 1 THEN score1 
        WHEN 2 THEN score2 
        ELSE score3 END

答案 3 :(得分:-1)

SELECT *
FROM tablename
WHERE
CASE WHEN @ScoreType = 1 THEN score1
WHEN @Scoretype = 2 THEN score2
WHEN @Scoretype = 3 THEN score3
END

不确定你用

尝试实现的目标
[>= @Score]

感谢编辑人员,我的愚蠢错误。