PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/11/2016 18:04:15

albourg
Membre

ERROR: UNION types text and integer cannot be matched

cec.machines(id) is an integer not null >=0
cec.machines(machineid)  is null when cec.machines(id) =0
cec.groupitems(iditem) is an integer not null (and is primary key of cec.groupitems).



running

select -2, null
union select 0, IDITEM from cec.GroupItems ;

works.
running

select id, null as gr
FROM cec.MACHINES 
WHERE MACHINEID IS NOT NULL 
union select -2, null;

also works.

But running

select id, null as gr
FROM cec.MACHINES 
WHERE MACHINEID IS NOT NULL 
union select -2, null
union select 0, IDITEM from cec.GroupItems ;

gives

ERROR:  UNION types text and integer cannot be matched
LINE 5: union select 0, IDITEM from cec.GroupItems
                        ^
********** Error **********

ERROR: UNION types text and integer cannot be matched
SQL state: 42804
Character: 110

Why why why why?

Dernière modification par albourg (15/11/2016 18:24:36)

Hors ligne

#2 15/11/2016 18:23:03

rjuju
Administrateur

Re : ERROR: UNION types text and integer cannot be matched

Bonjour,

La raison est que le type doit être connu au moment de faire un UNION.  Du coup, par défaut un NULL est typé en text, à défaut d'avoir une autre information.  Vous pouvez soit inverser l'ordre des élément dans la requête, soit typer explicitement le premier NULL en integer.

Hors ligne

#3 16/11/2016 11:48:07

albourg
Membre

Re : ERROR: UNION types text and integer cannot be matched

J'ai du mal avec cette explication:

abotest=# select null union select null union select 1;
ERROR:  UNION types text and integer cannot be matched
LINE 1: select null union select null union select 1;
                                                   ^
abotest=# rollback;
ROLLBACK
abotest=#  select null union select 1;
 ?column?
----------
        1

(2 rows)

Si ce que vous dites est vrai, alors select null union select 1 devrait planter aussi, or ce n'est pas le cas. En fait le souci se pose quand il y a deux null et un n°.

Hors ligne

#4 16/11/2016 12:38:04

rjuju
Administrateur

Re : ERROR: UNION types text and integer cannot be matched

Non, le soucis est que la norme sql impose de résoudre les types par "couple d'ensemble", donc deux par deux plutôt que globalement.

Hors ligne

#5 16/11/2016 13:17:54

albourg
Membre

Re : ERROR: UNION types text and integer cannot be matched

La norme SQL impose? En oracle ca marche en tout cas.

SQL> select null from dual union select null from dual union select 1 from dual;

      NULL
----------
         1

En access aussi.

Hors ligne

#6 16/11/2016 13:21:15

rjuju
Administrateur

Re : ERROR: UNION types text and integer cannot be matched

Et bien ni oracle ni access ne respectent la norme SQL sur ce point là.


Si vous voulez une référence : https://www.postgresql.org/message-id/9 … .pgh.pa.us



Tom Lane a écrit :

The reason we haven't done it is that it looks like the SQL standard requires type resolution for set-ops to happen one pair of input relations at a time. See SQL:2008 7.13 <query expression>, in which everything that's said about UNION/INTERSECT/EXCEPT is phrased in terms of exactly two input subqueries; for instance INTERSECT's result type is defined in syntax rule 18b as:


norme SQL a écrit :

The declared type of the i-th column of TR is determined by applying Subclause 9.3, "Result of data type combinations", to the declared types of the i-th column of T1 and the i-th column of T2.

Hors ligne

#7 16/11/2016 14:40:12

albourg
Membre

Re : ERROR: UNION types text and integer cannot be matched

The declared type of the i-th column of TR is determined by applying Subclause 9.3, "Result of data type combinations", to the declared types of the i-th column of T1 and the i-th column of T2.
1. Null union null=null
2. Null union int=int.
Je ne vois aucune raison d'assigner un type texte quand il n'y en a pas.

Hors ligne

#8 16/11/2016 14:48:28

rjuju
Administrateur

Re : ERROR: UNION types text and integer cannot be matched

Le problème est justement que NULL n'a pas de type, et qu'un champ doit avoir un type. Donc à défaut d'avoir pu trouver un type, NULL UNION NULL est résolu en text, probablement parce que c'est le type qui posera le moins de soucis.

Hors ligne

Pied de page des forums