2011-01-11 2 views
2

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

(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 в определении таблицы

Спасибо заранее!

ответ

-1
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%' 

Update:

К сожалению, есть проблема неправильно.

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

+0

Вы не поняли вопрос. Он не ищет функциональность 'LIKE'. –

+0

@ Петр: О, ты прав. Это должно быть ошибка, вероятно, приходится иметь дело с этим: http://archives.postgresql.org/pgsql-bugs/2008-01/msg00030.php – Quassnoi

+0

Итак, ответ: я не могу сделать что-то вроде этого? Думаю, 'LIKE' будет слишком медленным для моей цели. Спасибо, в любом случае) – Eralde

Смежные вопросы