#sql #postgresql #syntax-error #calculated-columns #alter-table
#sql #postgresql #синтаксическая ошибка #вычисляемые столбцы #alter-table
Вопрос:
Я пытаюсь понять взаимосвязь между двумя операциями в SQL — ADD COLUMN и CAST() . Я попытался создать новый столбец, содержащий длины значений другого столбца, в то время как этот другой столбец неудобно имеет тип INTEGER:
ALTER TABLE inventory
ADD inventory_id_len AS (CHAR_LENGTH(CAST(inventory_id AS VARCHAR)) FROM rental);
Но он возвращает:
ERROR: syntax error at or near "AS"
LINE 4: ADD inventory_id_len AS (CHAR_LENGTH(CAST(inventory_id AS V...
Спасибо.
Комментарии:
1. Подзапрос не разрешен для сгенерированного столбца. Примеры данных, желаемые результаты и объяснение того, что вы хотите сделать, помогут.
2. Да, безусловно. Несмотря на то, что уже есть некоторые ответы, я добавлю, каковы желаемые результаты
Ответ №1:
В Postgres вам нужно использовать generated always ... stored
синтаксис для добавления вычисляемого столбца. Для вашего варианта использования это будет выглядеть так:
alter table inventory
add inventory_id_len int
generated always as (char_length(inventory_id::text)) stored
;
В этом контексте подзапрос не имеет смысла; вычисляемый столбец принимает значение столбца inventory_id
в той же строке.
Ответ №2:
Если вы хотите добавить длину идентификатора в качестве сгенерированного столбца:
ALTER TABLE inventory
ADD inventory_id_len INT GENERATED ALWAYS AS (LEN(inventory_id::text) STORED;
Поскольку Postgres (пока) не поддерживает виртуальные сгенерированные столбцы, представление может больше соответствовать тому, что вы хотите:
create view v_inventory as
select i.*, len(inventory_id::text) as inventory_id_len
from inventory i;