2017-07-14 1 views
0

J'apprends psql, et je suis plutôt confondu avec le mot clé CASE.psql: utilisation de CASE

Dites que j'ai une table "pets".

name  | species |  owner  | gender |  color 
-------------+---------+--------------------+--------+--------------- 
Nagini  | snake | Lord Voldemort  | female | green 
Hedwig  | owl  | Harry Potter  | female | snow white 
Scabbers | rat  | Ron Weasley  | male | unspecified 
Pigwidgeon | owl  | Ron Weasley  | male | grey 
Crookshanks | cat  | Herminone Granger | male | ginger 
Mrs Norris | cat  | Argus Filch  | female | dust-coloured 
Trevor  | toad | Neville Longbottom | male | brown 

on me demande de « Utiliser CASE pour afficher les noms des animaux et une colonne pour indiquer si est long ou court le nom de l'animal (un nom long est strictement plus de 6 caractères). Filtre pour sélectionner femme seule animaux domestiques."

Le document officiel ne donne que des exemples utilisant CASE seul. Lorsque je tente de résoudre le problème, j'ai essayé

SELECT * 
CASE 
    WHEN name > 6 THEN 
    msg:= 'long' 
    ELSE 
    msg:= 'short' 
END CASE 
FROM pets WHERE gender = 'female'; 

qui m'a donné une erreur ERROR: syntax error at or near "CASE"

Puis-je combiner le cas avec instruction SELECT? Si oui comment? Si non, comment pourrais-je résoudre la tâche ci-dessus?

+0

Avez-vous vu https://www.postgresql.org/docs/8.4/static/functions-conditional.htm? Vous avez besoin d'une expression de cas plutôt que d'une déclaration de cas pour votre cas, ce qui vous donnera une autre colonne de résultat. Et ajouter la colonne après * sans une virgule pour la séparer ne fonctionnera pas non plus même si ce n'était pas une expression de casse. – Mic

Répondre

4

Selon la documentation de PostgreSQL (https://www.postgresql.org/docs/current/static/functions-conditional.html), la bonne façon d'une expression de cas est:

CASE WHEN condition THEN result [WHEN ...] [ELSE result] END

Selon le code affiché, vous terminez l'expression CASE END quand il devrait être FIN . Vous avez également oublié d'ajouter une virgule après l'astérisque. Je voudrais écrire votre requête de la manière suivante:

SELECT *, CASE WHEN length(name) > 6 THEN 'long' ELSE 'short' END as msg FROM pets WHERE gender = 'female';

+1

Devrait être 'longueur (nom)> 6' – Abelisto

+0

En effet longueur (nom)> 6 est nécessaire, mais cela fonctionne! Dans quelles situations ai-je besoin de la virgule après l'astérisque? – Meruemu

+0

@Meruemu, vous aurez besoin d'une virgule pour séparer les colonnes. Asterisk vous donnera toutes les colonnes de la table d'origine puis vous aurez besoin de la virgule pour ajouter la nouvelle colonne que vous vouliez. – ifdussaut