Совпадение типов данных столбцов

Для выполнения операций над множествами все запросы должны удовлетворять следующим правилам:

  • количество полей во всех запросах должно совпадать;
  • типы данных соответствующих полей должны совпадать.

Посмотрим, что это значит на практике. Таблицы для примеров:

SELECT *
  FROM table1
# value name
1 1 one
2 3 three
3 5 five
SELECT *
  FROM table2
# value name
1 2 two
2 3 three
3 4 four

Что будет, если количество столбцов в запросах не будет совпадать?

SELECT value, name
  FROM table1
 UNION
SELECT value
  FROM table1
each UNION query must have the same number of columns

Теперь попробуем объединить строки с разными типами данных столбцов:

SELECT value
  FROM table1
 UNION
SELECT name
  FROM table1
UNION types integer and text cannot be matched

Что делать, если очень хочется объединить столбцы с разными типами данных? Нужно их преобразовать к одному типу данных. Функции преобразования типов данных рассмотрим в отдельной теме, а пока преобразуем столбец value к строке:

SELECT value::text
  FROM table1
 UNION
SELECT name
  FROM table1
# value
1 1
2 3
3 5
4 one
5 three
6 five

Стоит отметить, что некоторые преобразования типов данных PostgreSQL делает автоматически. Например, целочисленные значения могут быть автоматически преобразованы к числам с плавающей точкой.

Если хочешь знать точные правила определения типа данных столбца, то можешь найти их здесь

5.5 Дубликаты строк

5.7 Сортировка