2013-09-08 20 views
16

Mam tabelę serwera SQL, w którym istnieją 2 kolumny, które chcę zaktualizować jedną z ich wartości zgodnie z flagą wysłaną do procedury przechowywanej wraz z nową wartością, coś jak:Jeśli warunek w kwerendzie aktualizacji serwera sql

UPDATE 
    table_Name 

SET 
    CASE 
     WHEN @flag = '1' THEN column_A += @new_value 
     WHEN @flag = '0' THEN column_B += @new_value 
    END AS Total 

WHERE 
    ID = @ID 

Jaki jest poprawny kod serwera SQL, aby to zrobić?

+0

Dlaczego '+ ='? Próbujesz dołączyć "@ nowa_wartość" do tego, co już jest w kolumnie? –

+0

Tak, jestem i dlatego potrzebuję warunkowego kodu aktualizacji, ponieważ w zależności od flagi zaktualizuję kolumnę docelową – M009

Odpowiedz

15

Obecne są odpowiedzi dobrze i powinno działać poprawnie, ale co jest nie tak z prostszym, bardziej oczywistym i łatwiejszym w utrzymaniu:

IF @flag = 1 
    UPDATE table_name SET column_A = column_A + @new_value WHERE ID = @ID; 
ELSE 
    UPDATE table_name SET column_B = column_B + @new_value WHERE ID = @ID; 

Jest to znacznie łatwiejsze do odczytania, aczkolwiek jest to bardzo proste zapytanie.

Oto przykład działający dzięki uprzejmości @snyder: SqlFiddle.

+0

W zapytaniu występuje błąd składni, sprawdź ten http://sqlfiddle.com/#!3/74fcd/11 –

+0

@snyder. Dzięki, to tylko średniki. [SqlFiddle] (http://sqlfiddle.com/#!3/74fcd/12). –

+0

@flem - Nie trzeba usuwać średników, wystarczy zmienić terminator instrukcji w panelu po prawej stronie. http://sqlfiddle.com/#!3/2ea6e/2 –

18

Coś jak to powinno działać:

UPDATE 
    table_Name 
SET 
    column_A = CASE WHEN @flag = '1' THEN column_A + @new_value ELSE column_A END, 
    column_B = CASE WHEN @flag = '0' THEN column_B + @new_value ELSE column_B END 
WHERE 
    ID = @ID 
7

Ponieważ używasz SQL 2008:

UPDATE 
    table_Name 

SET 
    column_A 
    = CASE 
     WHEN @flag = '1' THEN @new_value 
     ELSE 0 
    END + column_A, 

    column_B 
    = CASE 
     WHEN @flag = '0' THEN @new_value 
     ELSE 0 
    END + column_B 
WHERE 
    ID = @ID 

Jeśli uzywasz SQL 2012:

UPDATE 
    table_Name 
SET 
    column_A = column_A + IIF(@flag = '1', @new_value, 0), 
    column_B = column_B + IIF(@flag = '0', @new_value, 0) 
WHERE 
    ID = @ID 
2

to było wspaniałe:

UPDATE 
    table_Name 
SET 
    column_A = CASE WHEN @flag = '1' THEN column_A + @new_value ELSE column_A END, 
    column_B = CASE WHEN @flag = '0' THEN column_B + @new_value ELSE column_B END 
WHERE 
    ID = @ID 
+0

wydaje się, że temat jest już rozwiązany :) – Xstian

Powiązane problemy