2015-07-02 46 views
2

過濾這可能不是有效的SQL,但是這是我想要做的事:在WHERE指定不同的列組合使用情況下,通過

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

基本上,我想篩選通過WHERE子句中的不同列取決於@ScoreType的值。我猜猜我的方法無效嗎?如果是這樣,那麼對此有何正確的方法呢?

編輯:對不起,我不小心省略了end,同時簡化了查詢在這裏發佈。實際查詢的確有end。查詢本身運行良好,但結果不符合預期。事實證明這個問題是在其他地方。我懷疑WHERE條款,因爲我從來沒有嘗試過這樣的事情,並且不確定它是否是有效的SQL。

+1

這看起來不錯。你爲什麼認爲這行不通? –

+0

這種方法的唯一問題是que查詢計劃。爲了優化你的查詢,你可以考慮使用IF語句 – jean

+1

沒有'end'的情況? – xQbert

回答

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

不知道你正在努力實現與

[>= @Score] 

感謝編輯的傢伙,對我而言愚蠢的錯誤是什麼。

+0

where子句語法錯誤。案例是左側,> =你不明白的是where子句的右側。 – xQbert

+0

你的情況應該有一個結束@ alybaba726 –

1

這應該可能嗎?

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

編輯:

我認爲這個問題是:你忘了end的情況下

+0

這不正是OP建議的嗎? – Mureinik

+0

不添加這個'END' – xQbert

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) 
+1

這與OP的嘗試有着不同的含義。如果'@ ScoreType'爲'1'且'score1'小於'@ Score',則OP的WHERE子句將跳過該行。您的版本仍會檢查'score3> = @ Score',並可能意外返回該行。換句話說:OP的版本總是在列和'@ Score'之間進行一次比較,而你的選擇只有一個或兩個。 – HABO

0

這應該工作:

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