J'ai besoin d'utiliser une carte pour attribuer une valeur particulière à année code> en fonction de la valeur année_code code> a. Pour le moment, j'ai une grande déclaration si elle est évidemment difficile à maintenir. IF year_code = 'Y' THEN year := 2000; END IF;
IF year_code = '1' THEN year := 2001; END IF;
IF year_code = '2' THEN year := 2002; END IF;
-- and so on
4 Réponses :
Je suggérerais de créer une table temporaire et de le remplir avec vos données. Ensuite, vous pouvez relier les tables et convertir les données. Bien que cela puisse sembler comme beaucoup de travail pour une instruction SQL et qu'il peut y avoir des façons plus rapides, cela vous libérera bien lorsque vous êtes prêt à créer une table séparée. Vous pouvez alors simplement supprimer l'instruction TABLE TEMP et insérer des instructions et modifier simplement le nom de la table que vous reliez à partir de la table TEMP à la table nouvellement créée. P>
La seule autre solution assez propre que je vois consisterait à convertir les données au lieu d'utiliser une instruction IF. Par exemple, si l'année 2000 est la seule une lettre, vous pouvez faire une instruction si elle est si elle est Y (et le convertissez-la) et une autre si ce n'est pas Y, alors l'année est de 2000 + année. . Si vos années correspondent comme ça, ce serait un moyen assez simple de faire des choses pour l'instant. P>
La solution rapide et sale serait une importante déclaration de cas laid:
-- Untested "off the top of my head" code
array := ARRAY['Y', '2000', '1', '2001', /* ... */ ];
i := 1;
WHILE i <= array_length(array) LOOP
IF year_code = array[i] THEN
year := array[i + 1]::INTEGER;
EXIT; -- Found it so bust out of the loop.
ELSE
i := i + 2;
END IF;
END LOOP;
Si l'OP doit utiliser une table Temp, il est probablement plus logique de simplement utiliser une table. (Une table de base ordinaire, pas une table Temp.)
@Catcall: J'utiliserais probablement une table aussi, mais je n'ai mentionné que parce que quelqu'un d'autre l'a amené et je voulais ajouter des mises en garde.
Utilisez un Expression de table commune (CTE) dans votre fonction facilitera la remplacement du CTE avec une table de base plus tard, par exemple alternativement, une table dérivée: p> peut-être que la table de base ultérieure pourrait être un table de calendrier . p> p>
Génial, exactement ce que je cherchais.
J'ai été informé que certains nœuds de la base de données sont sur PostgreSQL 8.1 et cela ne fonctionnera pas. :(
[Table de calendrier] Le lien apporte à certains logiciels publicitaires. Peux tu vérifier s'il te plaît?
@Singularity: maintenant lié à une ancienne version.
Je suis partial à la cartographie des objets, qui peut être accompli via JSON.
Vous pouvez ignorer le CTE (avec). J'ai seulement inclus que cela peut donc être testé autonome, sans une colonne code> an_code code>. P>
L'utilisation d'une table est une meilleure idée lorsque je regarde vos données. Utilisez une autre table et faites référence à cette référence de table à votre table des parents.
J'aimerais pouvoir, et je le ferai plus tard. Mais j'ai été chargé de faire quelque chose de sale pour maintenant.
@mu ressemble à un bon outil. Cependant,
type "htstore" n'existe pas code>.Je peux comprendre comment une table est plus propre qu'une solution "rapide et sale". Je ne comprends pas comment ce n'est pas aussi rapide, cependant.