Pull to refresh

Comments 6

Заодно, она самостоятельно задает ... их типы - если мы не указали специально тип значения в поле, то будет выбран наиболее подходящий из трех стандартных вариантов: integernumeric или text.

Тут необходимо указать, что выбор типа данных выполняется по самой первой строке значений (что демонстрирует пример чуть ниже, с ошибкой типа данных).

Помимо статичных значений, в VALUES могут также использоваться NULL-значения, числовые значения в экспоненциальной форме и результаты вычисления выражений

Немного шире - в качестве элементов блока значений могут использоваться любые выражения, которые могут быть приведены к скалярному типу. Даже подзапросы.

values (1,2),(3,(select id from mytable order by created_at limit 1));

Маленькая тонкость - в отличие от литералов и выражений, подзапрос должен быть обёрнут в дополнительные скобки, которые и выполняют эту "скаляризацию".

Ограничения результата

Просмотрел весь блок - нигде не указано, что использование лимитирования (в любой синтаксической форме) совершенно бессмысленно, если оно не сопровождается выражением сортировки, причём во всех случаях, кроме использования WITH TIES, обеспечивающем уникальность записей по критерию сортировки. Без сортировки, как указано в блоке Порядок вывода строк (ORDER BY), порядок вывода в группе с равным значением выражения сортировки не определён, а возвращаемый результат соответственно недетерминирован. По моему мнению, эту истину следует повторять везде, где можно и где не можно, да ещё большими жирными буквами - начинающие сплошь и рядом о ней забывают.

Некоторые почему-то считают, что OFFSET нельзя указывать без LIMIT, но это не так:

VALUES
  ('a')
, ('b')
, ('c')
OFFSET 1;
-- a
-- b

??? OFFSET нумерует строки, начиная с нуля. Так что приведённый запрос должен вернуть последние две записи, т.е. 'b' и 'c'. Конечно, в данном случае сервер волен в выборе порядка, ибо отсутствует ORDER BY, но в обычных условиях он не стремится пересортировывать список - лишняя работа.

  • один описывает порядок, имена и типы столбцов, укацук

Понятно, что опечатка - но хотелось бы конкретики.

Либо в качестве имени столбца будет взято имя функции (random, generate_series, ...) или оператора (CASE, coalesce, nullif, ...).

Только в случае, если функция/оператор являются "самым последним действием" при вычислении выражения. Иначе получим безымянный столбец.

Кроме того, если два поля используют один и тот же топ-оператор/функцию, в результирующем наборе мы получим два одноимённых поля. И, если захотим обратиться по этому имени (скажем, это подзапрос) - получим ошибку ambiguous name. Всё - аналогично поведению, описанному в блоке по секции FROM.

Исключение дублей (DISTINCT)

Группировка строк (GROUP BY)

Считаю, что нужно явно описать случай, когда запись содержит NULL в выражении уникализации/группировки. Для начинающих поведение сервера в этом случае неочевидно.

??? OFFSET нумерует строки, начиная с нуля. ... укацук

Спасибо, поправил.

Только в случае, если функция/оператор являются "самым последним действием" при вычислении выражения. Иначе получим безымянный столбец.

Это не понял. Можно пример?

Считаю, что нужно явно описать случай, когда запись содержит NULL в выражении уникализации/группировки. Для начинающих поведение сервера в этом случае неочевидно.

Согласен, расширил.

SELECT generate_series(1,2) => generate_series

SELECT 1 + generate_series(1,2) => ?column?

Ну, это же уже не вызов функции, а выражение сложения. Но немного подправил, чтобы не возникало разночтений.

Даже в Калининграде есть офис ваш, а на Сахалине у нас или во Владике нет ничего. Тут люди тоже хотят в айти с московскими зп.

У нас есть и "безофисные" удаленные сотрудники. Разве что с Дальним Востоком может быть сложно взаимодействовать из-за разницы часовых поясов.

Sign up to leave a comment.