2017-08-18 5 views
2

Je ne comprends pas pourquoi cette requête:La colonne Nombre avec le nom 'count' renvoie plusieurs lignes. Pourquoi?

select count(base.*) from mytable base;

ne retourne plusieurs lignes.

select count(1) from mytable base;

renvoie le nombre approprié.

Il existe une colonne portant le nom count.

Quelqu'un peut-il expliquer ce comportement?

Voici les informations du schéma:

table_catalog,table_schema,table_name,column_name,ordinal_position,column_default,is_nullable,data_type,character_maximum_length,character_octet_length,numeric_precision,numeric_precision_radix,numeric_scale,datetime_precision,interval_type,interval_precision,character_set_catalog,character_set_schema,character_set_name,collation_catalog,collation_schema,collation_name,domain_catalog,domain_schema,domain_name,udt_catalog,udt_schema,udt_name,scope_catalog,scope_schema,scope_name,maximum_cardinality,dtd_identifier,is_self_referencing,is_identity,identity_generation,identity_start,identity_increment,identity_maximum,identity_minimum,identity_cycle,is_generated,generation_expression,is_updatable 
mydatabase,vcs,mytable,controlepunt,1,,YES,text,,1073741824,,,,,,,,,,,,,,,,mydatabase,pg_catalog,text,,,,,1,NO,NO,,,,,,,NEVER,,YES 
mydatabase,vcs,mytable,norm,2,,YES,text,,1073741824,,,,,,,,,,,,,,,,mydatabase,pg_catalog,text,,,,,2,NO,NO,,,,,,,NEVER,,YES 
mydatabase,vcs,mytable,fout,3,,YES,text,,1073741824,,,,,,,,,,,,,,,,mydatabase,pg_catalog,text,,,,,3,NO,NO,,,,,,,NEVER,,YES 
mydatabase,vcs,mytable,count,4,,YES,bigint,,,64,2,0,,,,,,,,,,,,,mydatabase,pg_catalog,int8,,,,,4,NO,NO,,,,,,,NEVER,,YES 
mydatabase,vcs,mytable,id,5,,YES,bigint,,,64,2,0,,,,,,,,,,,,,mydatabase,pg_catalog,int8,,,,,5,NO,NO,,,,,,,NEVER,,YES 
+0

Qu'est-ce qui ne va pas simplement avec 'select count (*) from mytable'? – jarlh

+0

Rien, je ne comprends tout simplement pas POURQUOI ce comportement se produit. – RobAu

+0

Bonne question. Cette requête n'est même pas une syntaxe SQL ANSI valide. – jarlh

Répondre

2

Ce style est apparemment appelé notation fonctionnelle.

Il fait table.col et col(table) équivalent.

Et table et table.* retournent le même ensemble de colonnes.

Cette question a plus d'informations sur ce: Using functional notation in PostgreSQL queries instead of dot notation

Dans les docs postgresql: https://www.postgresql.org/docs/9.1/static/xfunc-sql.html

Une autre option consiste à utiliser la notation fonctionnelle pour extraire un attribut. La façon simple d'expliquer cela est que nous pouvons utiliser indifféremment l'attribut notations (table) et table.attribute.

+0

merci pour les liens! –

1

Ce n'est pas une réponse - l'utiliser pour étendre les échantillons pour l'OP. il ne semble pas liée à des fonctions d'agrégation:

t=# create table s91("count" int); 
CREATE TABLE 
Time: 38.981 ms 
t=# insert into s91 values (1),(2),(3); 
INSERT 0 3 
Time: 13.929 ms 
t=# select count(base.*) from s91 base; 
count 
------- 
    1 
    2 
    3 
(3 rows) 

t=# alter table s91 rename COLUMN a to "manah_manah"; 
ALTER TABLE 
Time: 1.025 ms 
t=# select manah_manah(s91.*) from s91; 
manah_manah 
------------- 
      1 
      2 
      3 
(3 rows) 

mise à jour: semble column(alias_name) est une syntaxe valide:

s=# with c(a,b) as (values(1,2),(2,3)) 
select a(c),(c).a from c; 
a | a 
---+--- 
1 | 1 
2 | 2 
(2 rows) 
+0

Merci pour l'effort supplémentaire! Il semble que l'expression soit analysée en utilisant une préférence pour le nom de la colonne. Il ignore en quelque sorte la parenthèse-partie, mais je ne l'ai pas encore trouvé dans le 'gram.y' de Postgresql – RobAu

+0

Exemple mis à jour - semble être une fonctionnalité maintenant, pas le bug :) –

+0

Intéressant :) Je pourrais bien sûr passer à la' count (1) 'pour mon application .. J'espère que ce comportement pourrait se retrouver dans la documentation d'une manière syntaxique – RobAu