9
votes

Cartographie des valeurs sans table

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 commentaires

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 .


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.


4 Réponses :


3
votes

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.

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.


0 commentaires

4
votes

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;


2 commentaires

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.



15
votes

Utilisez un Expression de table commune (CTE) dans votre fonction facilitera la remplacement du CTE avec une table de base plus tard, par exemple xxx

alternativement, une table dérivée: xxx

peut-être que la table de base ultérieure pourrait être un table de calendrier .


4 commentaires

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.



0
votes

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 an_code . xxx


0 commentaires