2012-03-26 2 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) 

Если версия равна нулю, я хочу, чтобы список всех номеров версий был больше 0, если он не равен 0, то версия должна быть тем, что является значением.IF ELSE Statement в 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». –

+0

http://stackoverflow.com/questions/63447/how-do-you-perform-an-if-then-in-an-sql-select – assylias

ответ

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

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) –

+0

@PKG: Это чисто основано на вопросе OP. Спасибо, что выбрали это. – tobias86

+0

Спасибо, что ответили ребятами. Тем не менее, я могу быть объяснен неправильно, так как мой sql довольно сосет, но я обновил вопрос. если вы, ребята, найдете шанс снова взглянуть на это, я действительно буду этому благодарен. –

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