postgres: перегрузить / добавить операторы сравнения в домен - PullRequest
2 голосов
/ 11 января 2011

У меня есть столбец, который должен иметь 3 возможных значения (например, «A», «B», «C»). Для таких вещей принято использовать enum, но поскольку во многих таблицах в моей БД такой столбец будет, я хотел бы определить значение по умолчанию ('C') для типа, представляющего это перечисление.

(AFAIK без каких-либо дополнительных определений, мне нужно написать что-то вроде этого:

%COLUMN% %ENUM_TYPE% NOT NULL DEFAULT enum_first(null::%ENUM_TYPE%),

каждый раз, когда мне нужно такое перечисление)

CREATE TYPE ... оператор не позволяет определить значение по умолчанию, но CREATE DOMAIN ... делает.

Я попробовал маленький трюк: CREATE TYPE zzz_enum AS ENUM (...); CREATE DOMAIN zzz AS zzz_enum DEFAULT 'A';, но запрос со сравнением %zzz column% = 'A' приводит к ошибке:

... operator %zzz% = undefined ...

Как определить оператор сравнения для домена «вручную» или создать собственный тип, который будет:

  • Есть список возможных значений, которые я мог бы получить с помощью запроса
  • Имейте одно из этих значений в качестве значения по умолчанию
  • Будьте идентификатором, который я мог бы использовать как любой обычный тип SQL в определении таблицы

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 11 января 2011

Это должно работать, но это не так.Я думаю, что это ошибка.

Следите за обсуждением здесь: http://archives.postgresql.org/pgsql-bugs/2011-01/msg00082.php

0 голосов
/ 11 января 2011
CREATE FUNCTION zzz_like (a zzz_enum, b TEXT) RETURNS BOOLEAN
AS
$$
        SELECT  $1::TEXT LIKE $2;
$$
LANGUAGE 'sql'

CREATE OPERATOR ~~ (LEFTARG=zzz_enum, RIGHTARG=TEXT, PROCEDURE=zzz_like)

SELECT  *
FROM    zzz_test
WHERE   zzz_column LIKE '%A%'

Вы можете просто привести выражение к TEXT прямо в своем запросе:

SELECT  *
FROM    zzz_test
WHERE   zzz_column::TEXT LIKE '%A%'

Обновление:

Извините, проблема возникла неправильно.

Как уже упоминал @Peter, это действительно ошибка, поскольку домены над сложными типами, такими как array и enum, неявным образом не приводятся в anyarray и anyenum, необходимые для соответствующих операторов равенства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...