2012-03-26 176 views
2
SELECT S.Id, S.Name, S.Version, S.SoftNo 
FROM SOFTWARE S WITH(NOLOCK) 
WHERE (IF S.Version = 0 THEN S.Version > 0 ELSE S.Version = @Version) 
AND (IF S.SoftNo = 0 THEN S.SoftNo > 0 ELSE S.SoftNo = @SoftNo) 

如果Version等於零,我想列出所有的版本號大於0,如果它不等於0,那麼Version應該是它的任何值。IF ELSE SQL中的語句

這與SoftNo相同。

我該如何解決我的SQL查詢問題。它只是不起作用。

更多細節:

這就是我想實現:

if(Version == 0) 
{ 
    display every single rows if their version number is greater then 0; 
} 
else 
{ 
    Lets assume that Version is equal to 5. Then just display the rows if their Version number is equal to 5; 
} // This is like a C# code of what I am trying to do in my sql query. 
+0

System.Data.SqlClient.SqlException(0x80131904):關鍵字'IF'附近的語法不正確。在關鍵字'THEN'附近有錯誤的語法。在關鍵字'THEN'附近有錯誤的語法。 – 2012-03-26 09:54:52

+0

http://stackoverflow.com/questions/63447/how-do-you-perform-an-if-then-in-an-sql-select – assylias 2012-03-26 09:57:19

回答

0

相反,我想出了這個解決辦法,

sSQL = @"SELECT S.Id, S.Name, S.Version, S.SoftNo 
     FROM SOFTWARE S WITH(NOLOCK) 
     WHERE 1 = 1"; 
// 1=1 is used just to list everything. 

if(pVersion != 0) 
{ 
    sSQL += " AND S.Version = @Version"; 
} 
if(pSoftNo != 0) 
{ 
    sSQL += " AND S.SoftNo = @SoftNo"; 
} 

結論,如果其他部分移動到代碼的一面。

1

你必須使用CASE WHEN語句而不是如果

+0

您不能使用CASE WHEN來確定要執行的比較。它只發出值。 – tobias86 2012-03-26 10:05:10

0

不太瞭解,但如果你的意思是輸入變量等於零,你可以這樣做:

SELECT S.Id, S.Name, S.Version, S.SoftNo 
FROM SOFTWARE S WITH(NOLOCK) 
WHERE ((@Version = 0 AND S.Version > 0) OR (S.Version = @Version AND @Version > 0)) 
AND (@SoftNo = 0 AND S.SoftNo > 0) OR (@SoftNo = S.SoftNo AND @SoftNo > 0) 
1

嘗試是這樣的:

SELECT S.Id, S.Name, S.Version, S.SoftNo 
FROM SOFTWARE S WITH(NOLOCK) 
WHERE ((@Version = 0 AND S.Version > 0) OR 
     (@Version <> 0 AND S.Version = @Version)) AND 
     ((@SoftNo = 0 AND S.SoftNo > 0) OR 
     (@SoftNo <> 0 AND S.SoftNo = @SoftNo)) 
+0

如何能同時0和大於0? (S.Version = 0 AND S.Version> 0) – 2012-03-26 10:00:25

+0

@PKG:這純粹是基於OP的問題。謝謝你選擇了。 – tobias86 2012-03-26 10:02:26

+0

謝謝你的回答。但是,我可能會以錯誤的方式解釋,因爲我的sql非常糟糕,但我更新了這個問題。如果你們有機會再次看到它,我會非常感激。 – 2012-03-26 11:53:14

0

爲什麼不

SELECT S.Id, S.Name, S.Version, S.SoftNo 
FROM SOFTWARE S WITH(NOLOCK) 
WHERE 
(
    (@Version = 0 OR (@Version <> 0 AND S.Version = @Version)) 
    AND 
    (@SoftNo = 0 OR (@SoftNo <> 0 AND S.SoftNo = @SoftNo)) 
) 

(你真的需要NOLOCK?)

0

不要使用級聯SQL,它是窮人的習慣,增加SQL注入漏洞的可能性。現在你的SQL代碼是完全一樣的,如下(更安全)代碼:

SELECT 
    S.Id, S.Name, S.Version, S.SoftNo 
FROM 
    SOFTWARE S WITH(NOLOCK) 
WHERE 
    (@Version = 0 OR @Version = S.Version) 
    AND (@SoftNo = 0 OR @SoftNo = S.SoftNo) 
1

你有沒有想過使用SQL的情況下?

SELECT col1, col2, 
    CASE 
     WHEN expression THEN return 
     WHEN expression THEN return 
     ELSE return 
    END AS NameOfNewColWithReturnValues 
FROM Col_FROM_WHICH_TABLE