【问题标题】:Vertica: How to create a column using case?Vertica:如何使用案例创建列?
【发布时间】:2020-04-28 19:00:31
【问题描述】:

我有一个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

如何从我创建的第一列创建第二列?

【问题讨论】:

  • 您最好使用“派生”列的视图。这些值仅在数据加载到表中时设置,因此不能保证派生值是最新的。

标签: sql vertica


【解决方案1】:

读取错误信息: 看起来字符串不能引用

[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

【讨论】:

    【解决方案2】:

    您需要删除要用作另一个 DEFAULT 输入的列的 DEFAULT。

    而且,正如@user3380585 指出的那样,您可能需要检查正确的类型,因为'red' 不能是整数。

    试试这个脚本:

    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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-17
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多