2010-06-07 8 views
2

Dans l'une de nos bases de données, il y a une table avec des dizaines de colonnes, dont une colonne de géométrie.PostgreSQL: CHOISIR tous les champs, en filtrer

Je veux SELECT lignes de la table, avec la géométrie transformée en un autre SRID. Je veux utiliser quelque chose comme:

`SELECT *` 

afin d'éviter:

SELECT col_a, col_b, col_c, col_d, col_e, col_f, 
     col_g, col_h, transform(the_geom, NEW_SRID), ..., col_z 

Toutes les idées?

Adam

Répondre

5

Vous êtes problème est la longueur de la SELECT clause dans la requête? Eh bien je suppose que vous pourriez envisager de faire:

SELECT *, transform(the_geom, NEW_SRID) as newsrid 

ce qui est évidemment très court. Cependant, cela signifie que vous obtenez deux fois la valeur de colonne 'the_geom' pour chaque ligne.

Editer: Je tiens à souligner que je ne dis pas que j'aime faire 'SELECT *'. Peu importe le nombre de colonnes que je sélectionne dans une table, j'énonce toujours explicitement les noms. Cela nous amène à une autre question: «Quel est le problème de nommer explicitement toutes les colonnes?

Édition2: Bon, vous avez 60 colonnes dans la table que vous sélectionnez. Je sais que c'est beaucoup de travail de dactylographie, mais encore une fois, quel est le problème? Ce n'est qu'une question ponctuelle. Il existe probablement des programmes de gestion de base de données qui pourraient même générer la requête pour vous. Au moins, le logiciel que nous utilisons peut.

L'utilisation du joker n'est pas une bonne pratique, du moins pas dans cette situation. Ce n'est pas facile à maintenir, car dans votre environnement de programmation, vous ne pouvez pas voir une liste de colonnes. Vous devrez toujours vérifier cela via un programme de gestion de base de données. Et j'espère que vous n'accédez pas aux colonnes par index? Comme:

object columnvalue = row[21]; 

Parce que cela, en combinaison avec le joker, fera de votre programme un véritable enfer à maintenir. Vraiment, même si cela vous coûte plus de temps pour programmer, à la fin, nommer les colonnes de votre requête sera payant.

+0

Avoir 60 colonnes dans une table. –

+0

J'ai mis à jour ma réponse concernant 60 colonnes. – pyrocumulus

+0

+1 Bonne réponse. –

1
SELECT 
    *, -- get all 
    transform(the_geom, NEW_SRID) -- special case 
FROM 
    ... 
+0

Il obtient deux fois le fichier, ce qui prête à confusion. –

+0

Non, ce n'est pas le cas, il ne reçoit qu'une fois le fichier the_geom et une fois le fichier the_geom transformé. Vous pouvez également utiliser un alias, mais c'est à vous de décider. –

0

Une fois que vous avez sélectionné une colonne, vous ne pouvez plus la faire disparaître.

Vous pouvez créer une vue exposant les données qui vous intéressent, puis exécuter votre requête par rapport à cela, mais à mon avis, il vaut mieux simplement nommer explicitement les colonnes que vous voulez.

2

Si vous voulez éviter de taper les noms de colonnes puis quelque chose comme

SELECT array_to_string(array(SELECT CASE column_name WHEN 'the_geom' THEN 'transform(the_geom, NEW_SRID)' ELSE column_name END 
FROM information_schema.columns WHERE table_name = 'the_table'),E',\n'); 

vous obtiendrez la liste et modifier la colonne requise et peut ensuite être mis dans l'instruction select

0
select attname 
from pg_catalog.pg_attribute 
where not attisdropped 
    and attrelid=(select distinct tableoid from mytable); 

retournera les noms des colonnes dans "mytable". Je n'arrive pas à trouver le moyen de faire le reste strictement dans postgres, mais vous pouvez écrire une fonction dans la langue que vous utilisez pour joindre ces colonnes sauf celles que vous ne voulez pas et retourner votre chaîne de sélection.Ou, je voudrais simplement utiliser cette instruction pour tirer toutes les colonnes et l'utiliser pour éditer celles que je veux et écrire ma requête de cette façon et en finir avec. Si vous n'aimez pas une requête de 50 lignes au milieu de votre code, placez-la dans une bibliothèque pour ne pas avoir à la voir.

Questions connexes