2017-10-20 15 views
0

Comment modifier cette instruction de mise à jour de sorte que si la valeur n'a pas été trouvée dans la table GENDERSPELLING, la valeur GENDER serait définie sur «U»?Modifier l'instruction de mise à jour SQL

UPDATE DWCUST DW 
SET GENDER = (SELECT NEW_VALUE FROM GENDERSPELLING GS 
       WHERE DW.GENDER = GS.INVALID_VALUE) 
WHERE GENDER NOT IN ('M', 'F'); 
+0

Voulez-vous dire '' champ NEW_VALUE' est null' ou aucune ligne correspondante existe dans '' GENDERSPELLING? – zarruq

+0

sélectionnez le décodage (nouvelle_valeur, null, 'U', nouvelle_valeur) ... – Frank

+0

aucune ligne correspondante n'existe @zarruq –

Répondre

0

Je pense que cela devrait fonctionner.

UPDATE DWCUST DW 
SET GENDER = (
    SELECT CASE WHEN MAX(NEW_VALUE) IS NULL 
      THEN 'U' 
      ELSE MAX(NEW_VALUE) 
      END 
    FROM GENDERSPELLING GS 
    WHERE DW.GENDER = GS.INVALID_VALUE 
) 
WHERE GENDER NOT IN ('M', 'F'); 
+0

Im obtenir l'erreur à la ligne 2: mot clé SET absent –

+0

@NedKhivju J'ai fait un changement pouvez-vous le vérifier? – RRK

0

Vous pouvez utiliser COALESCE (ou d'Oracle NVL) pour mettre l'NULL en 'U': De la question

update dwcust dw 
set gender = 
    nvl((select new_value from genderspelling gs where dw.gender = gs.invalid_value), 'U') 
where gender not in ('M', 'F'); 
0

, je suppose que vous avez deux cas.

données de la colonne NEW_VALUE est nulle: Utilisation COALESCE

UPDATE DWCUST DW 
SET GENDER = (
     SELECT coalesce(NEW_VALUE, 'U') 
     FROM GENDERSPELLING GS 
     WHERE DW.GENDER = GS.INVALID_VALUE 
     ) 
WHERE GENDER NOT IN (
     'M' 
     ,'F' 
     ); 

DEMO

CORRELATED sub-Query renvoie pas de valeur: utilisation prolongée CASE

UPDATE DWCUST DW 
SET GENDER = CASE 
     WHEN (
       SELECT NEW_VALUE 
       FROM GENDERSPELLING GS 
       WHERE DW.GENDER = GS.INVALID_VALUE 
       ) IS NULL 
      THEN 'U' 
     ELSE (
       SELECT NEW_VALUE 
       FROM GENDERSPELLING GS 
       WHERE DW.GENDER = GS.INVALID_VALUE 
       ) 
     END 
WHERE GENDER NOT IN (
     'M' 
     ,'F' 
     ); 

OU COALESCE extérieur:

UPDATE DWCUST DW 
SET GENDER = coalesce((
      SELECT NEW_VALUE 
      FROM GENDERSPELLING GS 
      WHERE DW.GENDER = GS.INVALID_VALUE 
      ), 'U') 
WHERE GENDER NOT IN (
     'M' 
     ,'F' 
     ); 

DEMO