где круглые скобки с разделенными запятыми значениями больше - PullRequest
3 голосов
/ 02 апреля 2019

Это очень очень глупый и глупый вопрос, но я не могу понять, что означает следующее в Postgres:

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

В основном, что означает (last_updated, id) > (timestamp with time zone '2019-03-28 23:30:22.496+00:00', 0)? что это сравнивает? изменение второго значения по какой-то причине не влияет на результаты.

Ответы [ 3 ]

3 голосов
/ 02 апреля 2019

Это сравнение записей вместе.

Запись A строго больше, чем другая B, если крайнее левое поле A строго больше самого левого поля B или, если они равны, если 2-е поле A строго больше 2-го поляB или, если эти поля секунд равны друг другу, если 3-е поле A строго больше 3-го поля B или ... оно может продолжать сравнивать более 2 или 3 полей

Следовательно, (last_updated, id) > (timestamp with time zone '2019-03-28 23:30:22.496+00:00', 0) эквивалентно:

  1. Сравните в 1-м поле: last_updated > '2019-03-28 23:30:22.496+00:00'
  2. , если last_updated = '2019-03-28 23:30:22.496+00:00', затем сравните во 2-м поле id > 0

Или, если я поместил это в одно логическое выражение:

`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
)

Как видите, другой синтаксис был намного короче.


PS:В postgreSQL, по крайней мере, версии 11, вы можете использовать этот вид сравнения для очень приятного поиска, такого как:

SELECT *
FROM A
WHERE (field1, field2, field3) IN (SELECT field1, field2, field3 FROM B)
2 голосов
/ 02 апреля 2019

Сравнение кортежей использует лексографический порядок, что означает, что второе значение используется только в том случае, если первое значение связано.

Так что, если ваша строка имеет временную метку точно этого значения отсечения, тогда id должен быть больше 0.

Подсказка: используется для разбиения на страницы курсора, когда вторая страница начинается сразу после последнего значения на первой странице (в соответствии с критериями сортировки, здесь временная метка), а идентификатор используется в качестве прерывателя связей ( когда последняя запись на предыдущей странице и первая запись на следующей странице имеют одинаковое значение сортировки - вероятно, маловероятно для отметок времени, но очень вероятно, если вы заказываете по окладу или тому подобное).

1 голос
/ 02 апреля 2019

Заключенные в скобки значения являются строками.Из тонкой инструкции :

4.2.13.Конструкторы строк

Конструктор строк - это выражение, которое создает значение строки (также называемое составным значением), используя значения для его полей-членов.Конструктор строки состоит из ключевого слова ROW, левой круглой скобки, нуля или более выражений (разделенных запятыми) для значений поля строки и, наконец, правой круглой скобки.Например:

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

Ключевое слово ROW является необязательным, если в списке более одного выражения.

А затем немного дальше:

Кроме того, можно сравнить два значения строки или проверить строку с IS NULL или IS NOT NULL, например:

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

Таким образом, сравниваются две строки элементас помощью элемента <.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...