3
votes

clause where entre parenthèses avec des valeurs séparées par des virgules supérieures à

C'est une question très très noob et idiote mais je n'arrive pas à trouver ce que signifie ce qui suit dans Postgres:

select * 
from table 
where (last_updated, id) > (timestamp with time zone '2019-03-28 23:30:22.496+00:00', 0)

En gros, qu'est-ce que (last_updated, id)> (horodatage avec fuseau horaire '2019-03-28 23: 30: 22.496 + 00: 00', 0) signifie? qu'est-ce que ça compare? changer la deuxième valeur ne semble pas avoir d'effets sur les résultats pour une raison quelconque.


0 commentaires

3 Réponses :


3
votes

Il s'agit de comparer des enregistrements ensemble.

L'enregistrement A est strictement supérieur à un autre B si le champ le plus à gauche de A est strictement supérieur au champ le plus à gauche de B ou, s'ils sont égaux, si le 2e champ de A est strictement supérieur au 2e champ de B ou, si ces champs de secondes sont égaux entre eux à, si le 3e champ de A est strictement supérieur au 3e champ de B ou ... il peut continuer à faire des comparaisons pour plus de 2 ou 3 champs

Par conséquent , (last_updated, id)> (horodatage avec fuseau horaire '2019-03-28 23: 30: 22.496 + 00: 00', 0) équivaut à:

  1. Comparez sur le 1er champ: last_updated> '2019-03-28 23: 30: 22.496 + 00: 00'
  2. if last_updated = '2019-03-28 23: 30: 22.496 + 00: 00' puis comparez sur le 2ème champ id> 0

Ou si je le mets dans une seule expression booléenne:

SELECT *
FROM A
WHERE (field1, field2, field3) IN (SELECT field1, field2, field3 FROM B)

Comme vous pouvez le voir, l'autre syntaxe était beaucoup plus courte.


PS: Dans postgreSQL, au moins la version 11, vous pouvez utiliser ce type de comparaison pour des recherches très intéressantes telles que:

`last_updated > '2019-03-28 23:30:22.496+00:00'`
OR (
    last_updated = '2019-03-28 23:30:22.496+00:00'
    AND id > 0
)


0 commentaires

1
votes

Les valeurs entre parenthèses sont des lignes. À partir du manuel détaillé :

4.2.13. Constructeurs de lignes

Un constructeur de ligne est une expression qui construit une valeur de ligne (également appelée valeur composite) en utilisant des valeurs pour ses champs membres. Un constructeur de ligne se compose du mot clé ROW , d'une parenthèse gauche, de zéro ou plusieurs expressions (séparées par des virgules) pour les valeurs du champ de ligne, et enfin d'une parenthèse droite. Par exemple:

SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same');

SELECT ROW(table.*) IS NULL FROM table;  -- detect all-null rows

Le mot clé ROW est facultatif lorsqu'il y a plus d'une expression dans la liste.

Et puis un peu plus bas:

De plus, il est possible de comparer deux valeurs de ligne ou de tester une ligne avec IS NULL ou IS NOT NULL, par exemple:

SELECT ROW(1,2.5,'this is a test');

Les deux lignes sont donc comparées élément par élément en utilisant .


0 commentaires

2
votes

La comparaison des tuples utilise l'ordre lexographique, ce qui signifie que la deuxième valeur n'est utilisée que dans le cas où la première valeur est égale.

Donc, si votre ligne a un horodatage correspondant exactement à cette valeur limite, alors l'ID doit être supérieur à 0.

Hunch: Ceci est utilisé pour la pagination basée sur le curseur, où la deuxième page commence juste après la dernière valeur de la première page (selon les critères de tri, ici un horodatage), avec id utilisé comme un départage ( pour quand la dernière entrée de la page précédente et la première entrée de la page suivante ont la même valeur de tri - probablement peu probable pour les horodatages, mais très probable si vous commandez par salaire ou autre).


1 commentaires

oui vous avez raison, ceci est utilisé pour la pagination basée sur le curseur. Merci d'avoir répondu. Sélection de celui-ci comme réponse à cause de la supposition du curseur dans mon cas. D'autres réponses sont cependant correctes.