IF предложение в SQL из оператора - PullRequest
4 голосов
/ 15 августа 2011

Мне нужно временное решение проблемы, которую я создал. По сути, я хочу вычислить два значения, но использую другой метод, зависящий от результата условия.

select userReturnval, userregisterid, OtherValue
FROM
(
   (SELECT otherValue
   FROM...
   ) as tblO  --unrelated table
  ,

  ( 
    if (select count(userregisterid) from table1 where site =@siteID and userid=@userID) >0
      SELECT userReturnval, userregisterid
    FROM
    (
     SELECT userReturnval, userregisterid, Rank() OVER (PARTITION BY .. ORDER BY       ...) as RANK
            FROM ...
            WHERE --first where clause
        ) as tblRank
        WHERE (RANK =1)
    else
      SELECT userReturnval, userregisterid
      FROM
        (
     SELECT userReturnval, userregisterid, Rank() OVER (PARTITION BY .. ORDER BY       ...) as RANK
            FROM ...
            WHERE --different where clause
        ) as tblRank
        WHERE (RANK =1)

  ) as tblR

My if работает нормально само по себе, я просто включаю его как часть более крупного запроса. На данный момент sqlserver не нравится, если он там находится.

Надеюсь, кто-то может указать мне правильное направление!

1 Ответ

3 голосов
/ 15 августа 2011

Вы можете попробовать использовать операторы case в предложении WHERE, что-то вроде приведенного ниже. Обратите внимание, что я не думаю, что это будет особенно оптимально для производительности.

Делая это так, вы можете сохранить это в одном выражении:

select userReturnval, userregisterid, OtherValue
FROM
(
   (SELECT otherValue
   FROM...
   ) as tblO  --unrelated table
  ,

  ( 
    SELECT userReturnval, userregisterid
    FROM
    (
     SELECT userReturnval, userregisterid, Rank() OVER (PARTITION BY .. ORDER BY       ...) as RANK
            FROM ...
            WHERE 
                case --Choose which where clause to use
                    when (select count(userregisterid) from table1 where site =@siteID and userid=@userID) >0 then 
                        case when /*First where clause*/ then 1
                        else 0
                        end
                    else
                        case when /*Second where clause*/ then 1
                        else 0
                        end
                    end
                 = 1                
        ) as tblRank
        WHERE (RANK =1)
  ) as tblR
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...