CASE в предложении where с Col1 <> Col2 - PullRequest
3 голосов
/ 12 декабря 2011

В следующих примерах данных мне нужно выбрать все записи, где

  1. ModelOut=ModelOut (все)
  2. ModelIn<>ModelOut
  3. ModelIn=ModelOut

Проблема в ModelIn<>ModelOut, потому что я не знаю, как это сделать с помощью оператора CASE в предложении where.

Declare @type int;
SET @type=2; --- ModelIn <> ModelOut  

Create table #Data(ID int, ModelIn varchar(10), ModelOut varchar(10))
INSERT INTO #Data
    SELECT 1 AS ID,'A' AS ModelIn, 'B' AS ModelOut
    UNION ALL 
    SELECT 2 AS ID,'B' AS ModelIn, 'B' AS ModelOut
    UNION ALL 
    SELECT 3 AS ID,'C' AS ModelIn, 'D' AS ModelOut
    UNION ALL 
    SELECT 4 AS ID,'D' AS ModelIn, 'D' AS ModelOut

SELECT * FROM #Data
WHERE ModelOut =
    CASE  @type
        WHEN 1 THEN ModelOut --- all
        WHEN 2 THEN ???      --- ModelIn <> ModelOut
        WHEN 3 THEN ModelIn  --- ModelOut = ModelIn
    END
;

Drop table #Data;

Ответы [ 3 ]

4 голосов
/ 12 декабря 2011

Вам не нужно CASE для вашего запроса (на самом деле, это только усложняет ситуацию, я бы сказал). Просто напишите ваш запрос так:

SELECT * FROM #Data
WHERE (
    @type = 1 OR
   (@type = 2 AND (ModelIn <> ModelOut)) OR
   (@type = 3 AND (ModelOut = ModelIn))
);
1 голос
/ 12 декабря 2011

В этом случае вы можете сделать еще один трюк с еще одним CASE. Если предоставленное вами предложение WHERE не является упрощенной дисперсией более сложного запроса - я бы использовал подход, предложенный nyarlathotep с измененным предложением WHERE.

 WHERE ModelOut =
        CASE  @type
            WHEN 1 THEN ModelOut --- all
            WHEN 2 THEN 
                       CASE WHEN ModelIn <> ModelOut THEN ModelOut
                            ELSE ModelOut  + '_'
                       END
            WHEN 3 THEN ModelIn  --- ModelOut = ModelIn
        END

Так что, когда ModelIn <> ModelOut - весь CASE вернул бы true, иначе false

0 голосов
/ 12 декабря 2011
you should change your select query in this way

Declare @type int;
    SET @type=2; 
    SELECT * FROM #Data
    WHERE (@type = 1 )
    union
    SELECT * FROM #Data
    WHERE  (@type = 2 AND (ModelIn <> ModelOut)) 
      union 
      SELECT * FROM #Data
    WHERE    
          (@type = 3 AND (ModelOut = ModelIn))

может быть полезным

...