Булев, спецтипы и приведение типов

Знакомимся с булевым типом, фирменными типами PostgreSQL и приведением одного типа к другому.

Приведение типа (cast) — это явное преобразование значения из одного типа в другой, например строки '42' в число 42.

Логический тип boolean

boolean хранит истину или ложь. PostgreSQL принимает много написаний на ввод (true/false, 't'/'f', 'yes'/'no', 1/0), но в выводе и логике это всегда true/false. Третье состояние — NULL (значение неизвестно).

CREATE TABLE tasks (
    id   INTEGER PRIMARY KEY,
    name TEXT,
    done INTEGER   -- в песочнице SQLite булев эмулируем числом 0/1
);

INSERT INTO tasks (id, name, done) VALUES
    (1, 'Купить молоко', 1),
    (2, 'Помыть машину', 0),
    (3, 'Позвонить врачу', 0);

SELECT name FROM tasks WHERE done = 0;

Вывод:

Помыть машину
Позвонить врачу

В песочнице на SQLite отдельного типа boolean нет, поэтому здесь мы эмулируем его числом 0/1. В настоящем PostgreSQL столбец был бы done BOOLEAN, а условие — WHERE done = false.

Специальные типы PostgreSQL

Здесь PostgreSQL обгоняет многие СУБД. Эти типы редко встречаются «в базовом SQL», но в реальной работе незаменимы.

CREATE TABLE accounts (
    id       UUID DEFAULT gen_random_uuid() PRIMARY KEY,  -- глобально уникальный id
    tags     TEXT[],                                       -- массив строк
    settings JSONB                                         -- документ JSON
);

INSERT INTO accounts (tags, settings) VALUES
    (ARRAY['vip', 'beta'], '{"theme": "dark", "lang": "ru"}');
ТипЗачем
uuidглобально уникальный идентификатор, не зависит от счётчика
text[]массив значений прямо в одном столбце
json / jsonbхранение документов; jsonb — бинарный, индексируемый, быстрый

Работе с JSONB и массивами посвящён отдельный материал в последнем разделе — там много операторов.

Приведение типов: CAST и ::

Иногда нужно превратить значение одного типа в другой: строку в число, число в текст, текст в дату. Для этого есть два равнозначных способа.

-- Стандартный синтаксис CAST(значение AS тип)
SELECT CAST('42' AS INTEGER) + 8 AS result;

Вывод:

result
50

Тот же смысл короче записывают через оператор :: — это уже PostgreSQL-специфика:

-- PostgreSQL-сокращение: значение::тип
SELECT '42'::int + 8;          -- 50
SELECT 3.7::int;               -- 3 (усечение, не округление)
SELECT now()::date;            -- из timestamp оставить только дату
SELECT '2026-06-14'::date;     -- строка -> дата

Оператор :: очень удобен и встречается в PostgreSQL-коде повсюду. Но помните: CAST(... AS ...) — стандартный SQL и работает везде, а :: — фирменное сокращение PostgreSQL.

Итог

  • boolean хранит true/false/NULL; в PG условие пишут как WHERE done = false.
  • Фирменные типы uuid, массивы text[] и jsonb расширяют возможности далеко за «базовый SQL».
  • Приведение типов: стандартный CAST(x AS тип) или PostgreSQL-сокращение x::тип.
Проверьте себя
1. Сколько состояний может принимать столбец типа boolean в PostgreSQL?
AТолько два: true и false
BТри: true, false и NULL
CЛюбое число
DЗависит от размера столбца
2. Чем jsonb отличается от json в PostgreSQL?
AНичем, это синонимы
Bjsonb хранится в бинарном виде, его можно индексировать и он быстрее в запросах
Cjson новее jsonb
Djsonb хранит только числа
3. Что вернёт выражение 3.7::int в PostgreSQL?
A4 (округление)
B3 (усечение дробной части)
C3.7
DОшибку
Поддержать проект