Для выполнения операций над множествами все запросы должны удовлетворять следующим правилам:
- количество полей во всех запросах должно совпадать;
- типы данных соответствующих полей должны совпадать.
Посмотрим, что это значит на практике. Таблицы для примеров:
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 делает автоматически. Например, целочисленные значения могут быть автоматически преобразованы к числам с плавающей точкой.
Если хочешь знать точные правила определения типа данных столбца, то можешь найти их здесь