Поддерживает ли PostgreSQL вычисляемые / вычисляемые столбцы, такие как MS SQL Server? Я ничего не могу найти в документации, но, поскольку эта функция включена во многие другие СУБД, я подумал, что, возможно, мне что-то не хватает.
Например: http://msdn.microsoft.com/en-us/library/ms191250.aspx
postgresql
calculated-columns
sql-view
materialized-views
generated-columns
Майк Чемберлен
источник
источник
Ответы:
Сгенерированные столбцы до Postgres 11 не поддерживаются - как определено в стандарте SQL и реализовано некоторыми СУБД, включая DB2, MySQL и Oracle. И аналогичные «вычисляемые столбцы» SQL Server.
STORED
сгенерированные столбцы представлены в Postgres 12 . Тривиальный пример:db <> скрипка здесь
VIRTUAL
сгенерированные столбцы могут появиться в одной из следующих итераций. (Пока нет в Postgres 13).Связанный:
А пока вы можете имитировать
VIRTUAL
сгенерированные столбцы с помощью функции, использующей нотацию атрибутов (tbl.col
), которая выглядит и работает так же, как виртуально сгенерированный столбец . Это немного странный синтаксис, который существует в Postgres по историческим причинам и подходит для случая. В этом связанном ответе есть примеры кода :Однако выражение (похожее на столбец) в
SELECT * FROM tbl
. Вы всегда должны указывать это явно.Также может поддерживаться соответствующий индекс выражения - при условии, что функция есть
IMMUTABLE
. Подобно:альтернативы
В качестве альтернативы вы можете реализовать аналогичные функции с помощью a
VIEW
, необязательно в сочетании с индексами выражений. ЗатемSELECT *
можно включить сгенерированный столбец.STORED
Вычисляемые столбцы "Persisted" ( ) могут быть реализованы с помощью триггеров функционально идентичным образом.Материализованные представления - это тесно связанная концепция, реализованная начиная с Postgres 9.3 .
В более ранних версиях можно было управлять MV вручную.
источник
Да, ты можешь!! Решение должно быть простым, безопасным и производительным ...
Я новичок в postgresql, но, похоже, вы можете создавать вычисляемые столбцы, используя индекс выражения в сочетании с представлением (представление не является обязательным, но делает жизнь немного проще).
Предположим, мое вычисление таково
md5(some_string_field)
, тогда я создаю индекс как:Теперь любые
MD5(some_string_field)
выполняемые запросы будут использовать индекс, а не вычислять его с нуля. Например:Вы можете проверить это с помощью объяснения .
Однако на этом этапе вы полагаетесь на пользователей таблицы, которые точно знают, как построить столбец. Чтобы упростить жизнь, вы можете создать
VIEW
расширенную версию исходной таблицы, добавив вычисленное значение в качестве нового столбца:Теперь любые запросы, которые используются
some_table_augmented
, можно будет использовать,some_string_field_md5
не беспокоясь о том, как это работает ... они просто получают хорошую производительность. Представление не копирует данные из исходной таблицы, поэтому оно хорошо как с точки зрения памяти, так и с точки зрения производительности. Однако обратите внимание, что вы не можете обновлять / вставлять в представление, только в исходную таблицу, но если вы действительно хотите, я считаю, что вы можете перенаправить вставки и обновления в исходную таблицу с помощью правил (я мог ошибаться в этом последнем пункте, поскольку Сам никогда не пробовал).Изменить: кажется, что если запрос включает конкурирующие индексы, механизм планировщика может иногда вообще не использовать индекс-выражение. Выбор, похоже, зависит от данных.
источник
if the query involves competing indices
?Один из способов сделать это - использовать триггер!
Триггер срабатывает перед обновлением или вставкой строки. Он изменяет поле, которое мы хотим вычислить для
NEW
записи, а затем возвращает эту запись.источник
insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;
и оно только что вернулось: 1 2 и 4 8insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;
значениеtwo
столбца будет рассчитано автоматически!PostgreSQL 12 поддерживает сгенерированные столбцы:
db <> демо скрипта
источник
Не уверен, что Вы имеете в виду именно это, но Posgres обычно поддерживает "фиктивный" синтаксис ETL. Я создал один пустой столбец в таблице, а затем мне нужно было заполнить его расчетными записями в зависимости от значений в строке.
источник
У меня есть код, который работает, и я использую термин рассчитанный, я не использую чистый postgresSQL, хотя мы работаем на PADB
вот как это используется
источник
Легкое решение с ограничением Check:
источник
field as 1 persisted
.