Je souhaite faire une demande de bascule telle que définie ici T-SQL: Utilisation d'un CASE dans une instruction UPDATE pour mettre à jour certaines colonnes en fonction d'une condition

J'ai fait ça :

Update capteur 
join smartparking_reference on(smartparking_reference.id_capteur = capteur.id_capteur) 
set (CASE WHEN capteur.valeur != 0 then capteur.valeur = 0 and last_value_date = now() END) 
where smartparking_reference.id_ref = 3;

Mais toujours une erreur de syntaxe. Et alors ... qu'est-ce que j'ai loupé ?

0
Little squirrel 20 avril 2017 à 18:02

3 réponses

Meilleure réponse
UPDATE capteur
SET capteur.valeur=(
    CASE
    WHEN capteur.valeur != 0 THEN
        0 ELSE 'another value'
    END
),last_value_date = now ()
FROM capteur
INNER JOIN smartparking_reference ON 
    smartparking_reference.id_capteur = capteur.id_capteur
WHERE
    smartparking_reference.id_ref = 3;
0
Aquiles Perez 20 avril 2017 à 15:19

Apparemment, vous voulez mettre à jour capteur.valeur uniquement quand il est différent de zéro et le mettre à zéro. Essayez cette déclaration plus simple:

Style MySql

Update capteur 
join smartparking_reference on(smartparking_reference.id_capteur = capteur.id_capteur) 
set valeur = case when valeur = 0 then 1 else 0 end, last_value_date = now()
where smartparking_reference.id_ref = 3;

Style de serveur SQL

Update capteur 
set valeur = case when valeur = 0 then 1 else 0 end, last_value_date = getdate()
from smartparking_reference
where smartparking_reference.id_capteur = capteur.id_capteur 
and smartparking_reference.id_ref = 3;
1
Giorgos Altanis 20 avril 2017 à 20:15

Je suppose également que votre déclaration de mise à jour a la mauvaise syntaxe

UPDATE c
SET valeur = 0, last_value_date = now()
FROM capteur c
  INNER JOIN smartparking_reference AS sr ON 
    sr.id_capteur = c.id_capteur
WHERE sr.id_ref = 3 and c.valeur != 0
0
Kevin 20 avril 2017 à 15:12