#postgresql #enums
Вопрос:
Постгрес 12.
У меня есть перечисление, как:
CREATE TYPE state_t AS ENUM('OPENING', 'OPENED', 'CLOSING', 'CLOSED');
CREATE CAST (state_t AS TEXT) WITH INOUT AS IMPLICIT;
и такой стол, как:
CREATE TABLE files (
...
fstate state_t NOT NULL,
...
);
и некоторые вопросы, такие как:
SELECT ... FROM files WHERE fstate IN ('OPENING', 'OPENED') ...;
Конечно, в запросе есть ошибка типа, поэтому я переписал его как:
SELECT ... FROM files WHERE fstate::TEXT IN ('OPENING', 'OPENED') ...;
Но потом я прочитал хорошую книгу, в которой автор написал: «Никогда не добавляйте перечисления в текст, потому что это приводит к проблемам с производительностью…» (чтобы избежать сравнения текстов вместо значений ints — перечислений). Итак, мой вопрос — очевидно, я должен выполнить приведение, чтобы избежать ошибки типа, но как это сделать правильно, чтобы избежать КАКИХ-ЛИБО проблем с производительностью (чтобы сделать это наилучшим образом)?
Конечно, я пытался:
SELECT ... FROM files WHERE fstate::TEXT IN ('OPENING'::state_t, 'OPENED'::state_t) ...;
но:
- Я получил ошибку «оператор не уникален: state_t = state_t … ПОДСКАЗКА: Не удалось выбрать лучшего оператора-кандидата. Возможно, вам потребуется добавить явные приведения типов»
- Он выглядит слишком раздутым
Итак, как это сделать?
Ответ №1:
Итак, как это сделать?
Избавьтесь от гипса, тогда состояние IN ('OPENING', 'OPENED')
будет работать просто отлично