2017-02-08 3 views
0

Я искал в Интернете, но не могу найти решение для моей проблемы (но, возможно, я использую неправильные ключевые слова;)).Есть ли способ добавить логический оператор в предложение WHERE с помощью операторов CASE? - T-SQL

У меня есть хранимая процедура, которая выполняет автоматическую проверку (каждую ночь) для кучи записей. Однако иногда пользователь хочет сделать одну и ту же проверку для отдельной записи вручную. Я думал о вызове хранимой процедуры с параметром, когда установленный исходный оператор SELECT (который проходит через все записи) должен получить оператор AND с указанным идентификатором записи. Я хочу сделать это так, чтобы мне не пришлось копировать весь оператор select и изменять его только для ручной части.

Оригинальное заявление выглядит следующим образом:

DECLARE GenerateFacturen CURSOR LOCAL FOR 
    SELECT TOP 100 PERCENT becode, dtreknr, franchisebecode, franchisenemer, fakgroep, vonummer, vovolgnr, count(*) as nrVerOrd, 
              FaktuurEindeMaand, FaktuurEindeWeek 
     FROM (
      SELECT becode, vonummer, vovolgnr, FaktuurEindeMaand, FaktuurEindeWeek, uitgestfaktuurdat, levdat, voomschrijving, vonetto, 
           faktureerperorder, dtreknr, franchisebecode, franchisenemer, fakgroep, levscandat 
       FROM vwOpenVerOrd WHERE [email protected] AND levdat IS NOT NULL AND fakstatus = 0 
       AND isAllFaktuurStukPrijsChecked = 1 AND IsAllFaktuurVrChecked = 1 
       AND (uitgestfaktuurdat IS NULL OR uitgestfaktuurdat<[email protected]) 
         ) sub 
       WHERE faktureerperorder = 1 
       GROUP BY becode, dtreknr, franchisebecode, franchisenemer, fakgroep, vonummer, vovolgnr, 
           FaktuurEindeMaand, FaktuurEindeWeek 
       ORDER BY MIN(levscandat) 

В WHERE faktureerperorder = 1 я придумал что-то вроде этого:

WHERE faktureerperorder = 1 AND CASE WHEN @myParameterManual = 1 THEN [email protected] ELSE 1=1 END 

Но это не работает. @myParameterManual указывает, следует ли выбрать только конкретную запись. Идентификатор записи - [email protected]. Я думал, установив 1=1 Я бы получил все записи.

Любые идеи о том, как достичь моей цели (возможно, более эффективных идей или лучших идей)?

+2

'WHERE faktureerperorder = 1 AND (@myParameterManual = 0 ИЛИ vonummer = @vonummer)' – Eric

+0

Does [this] (http://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition/10260297#10260297) ответьте на помощь? – HABO

ответ

2

Мне сложно прочитать ваш запрос, но это, надеюсь, простой пример того, чего вы пытаетесь достичь.

Я использовал предложение WHERE с оператором OR, чтобы предоставить вам 2 варианта на фильтре. Используя тот же запрос, вы получите разные выходы в зависимости от значения фильтра:

CREATE TABLE #test (id INT, val INT); 

INSERT INTO #test 
     (id, val) 
VALUES (1, 10), 
     (2, 20), 
     (3, 30); 

DECLARE @filter INT; 

-- null filter returns all rows 
SET @filter = NULL; 

SELECT * 
FROM #test 
WHERE (@filter IS NULL 
      AND id < 5 
     ) 
     OR (@filter IS NOT NULL 
      AND id = @filter 
      ); 

-- filter a specific record 
SET @filter = 2; 

SELECT * 
FROM #test 
WHERE (@filter IS NULL 
      AND id < 5 
     ) 
     OR (@filter IS NOT NULL 
      AND id = @filter 
      ); 

DROP TABLE #test; 

Первый запрос возвращает все:

id val 
1 10 
2 20 
3 30 

Второй запрос возвращает одну строку:

id val 
2 20 
+0

Это сработало отлично. Спасибо! – Nicolas

 Смежные вопросы

  • Нет связанных вопросов^_^