web-dev-qa-db-fra.com

si condition dans la requête de mise à jour du serveur SQL

J'ai une table SQL Server dans laquelle il y a 2 colonnes que je veux mettre à jour l'une ou l'autre de leurs valeurs en fonction d'un indicateur envoyé à la procédure stockée avec la nouvelle valeur, quelque chose comme:

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

Quel est le bon code de serveur SQL pour le faire?

21
M009

Les réponses actuelles sont correctes et devraient fonctionner correctement, mais quel est le problème avec les plus simples, les plus évidentes et les plus maintenables:

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;

C'est beaucoup plus facile à lire, bien qu'il s'agisse d'une requête très simple.

Voici un exemple de travail gracieuseté de @snyder: SqlFiddle .

18
Paul Fleming

Quelque chose comme ça devrait fonctionner:

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
24
Joachim Isaksson

Puisque vous utilisez 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

Si vous utilisiez 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
10
Preet Sangha

cela a très bien fonctionné:

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
3
MJBLACKEND
DECLARE @JCnt int=null
SEt @JCnt=(SELECT COUNT( ISNUll(EmpCode,0)) FROM tbl_Employees WHERE EmpCode=1  )

UPDATE #TempCode
SET janCA= CASE WHEN @JCnt>0 THEN (SELECT SUM (ISNUll(Amount,0)) FROM tbl_Salary WHERE Code=1 )ELSE 0 END
WHERE code=1
0
JIYAUL MUSTAPHA