Оптимальный способ использования перечислений с предикатом IN

#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) ...;
 

но:

  1. Я получил ошибку «оператор не уникален: state_t = state_t … ПОДСКАЗКА: Не удалось выбрать лучшего оператора-кандидата. Возможно, вам потребуется добавить явные приведения типов»
  2. Он выглядит слишком раздутым

Итак, как это сделать?

Ответ №1:

Итак, как это сделать?

Избавьтесь от гипса, тогда состояние IN ('OPENING', 'OPENED') будет работать просто отлично

Онлайн-пример