2017-10-12 24 views
0

Je sais avec Azure qu'il est possible de combiner un IF x THEN UPDATE ELSE INSERT, est-il possible de faire la même chose avec Redshift SQL?(combiner les instructions CASE et UPDATE) UPSERT dans Amazon Redshift

J'essaie actuellement ce code:

SELECT source, 
CASE WHEN (SELECT 1 FROM state WHERE name = 
'out_dev' AND environment = 'dev') > 0 
THEN 
(UPDATE state SET source='new source') 
ELSE (
INSERT state (source, name, load_time, hash, environment) 
VALUES ('test', 'out_dev', '2017-10-12 01:14:38', '"f324f873b05d0792a3192bc28f466835"', 'dev')) 
END 
FROM state 

Cela renvoie l'erreur:

[Amazon](500310) Invalid operation: syntax error at or near "state" 

Position: 132; 

(UPDATE state SET source='new source') 

Je suis nouveau à Redshift donc pardonner si je ne suis pas voir quelque chose d'évident.

+0

ce n'est pas comment insérer et mettre à jour fonctionnent. pourquoi est-ce étiqueté azur? vous ne pouvez pas utiliser insert et update dans les sous-requêtes comme ça. lisez les docs redshift/postgres à la mise à jour et insérez. –

Répondre

0

Pour répondre à votre première question, Redshift SQL n'a pas d'instructions de contrôle de flux comme "If - Then - Else", donc ce n'est pas possible comme vous le faites.

Pour votre exemple précis, il n'y a pas vraiment clair ce que vous essayez d'atteindre, mais si vous voulez insérer conditionnellement la ligne de « test » si elle n'existe pas que vous pouvez faire quelque chose comme:

INSERT INTO state (source, name, load_time, hash, environment) 
SELECT 
    'test', 
    'out_dev', 
    '2017-10-12 01:14:38', 
    '"f324f873b05d0792a3192bc28f466835"', 
    'dev' 
WHERE NOT EXISTS 
    (
    SELECT 1 FROM state 
    WHERE name = 'out_dev' AND environment = 'dev' 
) 
;