PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Effet inattendu du filtrage sur le résultat de la requête crosstab()

extra1, extra2, ... sont des "colonnes supplémentaires" dans la terminologie du tableau croisé.
Le manuel du module tablefunc explique les règles :

Et plus bas :

J'insiste audacieusement sur les éléments clés.

Vous ne triez que par row_name :

ORDER  BY row_name ASC

Peu importe dans le premier exemple où vous filtrez avec :

WHERE ... t.extra1 = 'val1'  -- single quotes by me

Toutes les lignes d'entrée ont extra1 = 'val1' De toute façon. Mais c'est important dans le deuxième exemple où vous filtrez avec :

WHERE ... t.extra1 IN('val1', ...) --> More values

Maintenant, la première exigence en gras ci-dessus n'est pas respectée pour la colonne supplémentaire extra1 . Bien que l'ordre de tri de la première requête d'entrée soit non déterministe, les valeurs résultantes pour la colonne "extra" extra1 sont choisis arbitrairement. Plus de valeurs possibles pour extra1 , moins de lignes finiront par avoir 'val1' :c'est ce que vous avez observé.

Vous pouvez toujours le faire fonctionner :pour signaler extra1 = 'val1' pour chaque row_name qui en a au moins un, changez le ORDER BY à :

ORDER  BY row_name, (extra1 <> 'val1')

Trie 'val1' en premier. Explication pour ce boolean expression (avec des liens vers plus):

D'autres colonnes "supplémentaires" sont toujours choisies arbitrairement alors que l'ordre de tri n'est pas déterministe.

Principes de base du tableau croisé :