Vertica: Как создать столбец с помощью case? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть stats таблица типа

name | age | sound
------------------
 m   | 5   |   a
 a   | 3   |   c
 c   | 5   |   d
 f   | 1   |   j
 d   | 6   |   r
 c   | 55  |   d

, и я добавляю столбец с именем appearance

ALTER TABLE stats
    ADD appearance INTEGER DEFAULT case
                         when age > 4 then 'red'
                         when name = f then 'blue'

        end

и получаю таблицу типа:

name | age | sound | appearance
--------------------------------
 m   | 5   |   a   |   red
 a   | 3   |   c   |   <null>
 c   | 5   |   d   |   red
 f   | 1   |   j   |   blue
 d   | 6   |   r   |   red
 c   | 55  |   d   |   red

Затем я хочу добавить еще один столбец, который называется flavor

ALTER TABLE stats
    ADD flavor varchar(20) case
                    WHEN appearance = 'red' THEN 'apple'
                    WHEN appearance = 'blue' THEN 'blueberry'
    END

Но я продолжаю получать сообщение об ошибке:

[Vertica][VJDBC](7344) ROLLBACK: default expressions may not refer to other columns with default expressions

Как создать второй столбец из первый столбец, который я создал?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Вам нужно отбросить DEFAULT столбца, который вы хотите использовать в качестве ввода другого DEFAULT.

И, как указал @ user3380585, вы, возможно, захотите проверить правильность типов, например * 1003. * не может быть INTEGER.

Попробуйте этот скрипт:

CREATE TABLE stats(name,age,sound) AS (                                                                                                                                                                                                       
          SELECT 'm',5,'a'
UNION ALL SELECT 'a',3,'c'
UNION ALL SELECT 'c',5,'d'
UNION ALL SELECT 'f',1,'j'
UNION ALL SELECT 'd',6,'r'
UNION ALL SELECT 'c',55,'d'
)
;
SELECT * FROM stats;
-- out  name | age | sound 
-- out ------+-----+-------
-- out  a    |   3 | c
-- out  c    |   5 | d
-- out  c    |  55 | d
-- out  d    |   6 | r
-- out  f    |   1 | j
-- out  m    |   5 | a
ALTER TABLE stats ADD appearance CHAR(4) DEFAULT 
    CASE    
        WHEN age > 4    THEN 'red'    
        WHEN name = 'f' THEN 'blue'    
    END;

ALTER TABLE stats ALTER COLUMN appearance DROP DEFAULT;

ALTER TABLE stats ADD flavor varchar(20) DEFAULT
    CASE
      WHEN appearance = 'red' THEN 'apple'
      WHEN appearance = 'blue' THEN 'blueberry'
    END;

SELECT * FROM stats;
-- out  name | age | sound | appearance |  flavor   
-- out ------+-----+-------+------------+-----------
-- out  a    |   3 | c     |            | 
-- out  c    |   5 | d     | red        | apple
-- out  c    |  55 | d     | red        | apple
-- out  d    |   6 | r     | red        | apple
-- out  f    |   1 | j     | blue       | blueberry
-- out  m    |   5 | a     | red        | apple
-- out (6 rows)
-- out 
-- out Time: First fetch (6 rows): 3.510 ms. All rows formatted: 3.552 ms

0 голосов
/ 28 апреля 2020

Чтение сообщения об ошибке: похоже, что строка не может ссылаться на

[Vertica] VJDBC ERROR 7344: строковые выражения могут не ссылаться на другие столбцы со строковыми выражениями

Просто предположение. Извините, у меня нет базы данных vertica для тестирования

ALTER TABLE stats
    ADD appearance INTEGER DEFAULT case
                         when age > 4 then 'red'
                         when name = f then 'blue'
           else ''
        end

Может быть попробовать это

ALTER TABLE stats
    ADD flavor varchar(20) case
                    WHEN appearance = 'red' THEN 'apple'
                    WHEN appearance = 'blue' THEN 'blueberry'
       else ''
    END
...