Как добавить новый столбец, используя ПРИВЕДЕНИЕ и информацию из другой таблицы в SQL?

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