2012-03-26 117 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