2013-05-08 125 views
0

我有一个表A和包含值如何将结果存储在表中?

NAME  AGE 
Loga  18 
Anitha 20 
Saranya 13 

我测试表中的值,如果使用的情况下声明的情况下条件时,AGE> = 18然后“主要” 别的“次要”然后将结果是像

NAME  AGE CASE 
Loga  18 'major' 
Anitha 20 'major' 
Saranya 13 'minor' 

我想在我的A表中添加CASE和永久结果的值。它有可能吗?

回答

2
alter table a add column new_column_name text; 

update a 
set new_column_name = case when age >= 18 then 'major' else 'minor' end 
+0

这个更新语句不必要的复杂 - 你只想'new_column_name = case when age> = 18 then'major'else'minor'end' – IMSoP 2013-05-08 12:03:08

+0

@IMSoP是的,更正了,谢谢。 – 2013-05-08 12:09:03

0

您需要先使用ALTER TABLE ... ADD COLUMN将该列添加为NULLable,然后为所有现有值填充该列;你可能会然后需要将其设置非空的:

ALTER TABLE a ADD COLUMN new_column text NULL; 
UPDATE a SET new_column = CASE WHEN age >= 18 THEN 'major' ELSE 'minor' END; 
ALTER TABLE a ALTER COLUMN new_column SET NOT NULL; 

这将填充初始值,并使其强制填充新值的列,但不会反映任何变化(这样你就可以将age更新为18以上,但将标签保留为'minor')。

如果age和新列之间的关系必须始终坚持,你可能要考虑更复杂的东西:

  • 检查约束迫使所有行
  • 触发符合条件自动更新当插入或更改年龄时的新列
  • 使用视图或函数在一个位置捕获逻辑但不将其冗余存储在表本身
+0

任何人都在意解释downvote?问题被标记为PostgreSQL,这是实现与其他答案所建议的结果相同的最有效方式。我现在还添加了一些关于进一步考虑事项的注释。 – IMSoP 2013-05-08 11:59:19

+0

我很久以前就放弃了对驾驶型downvotes的怀疑。如果他们不解释,就忽略他们。 – 2013-05-08 12:03:48

+1

啊,我的坏处,似乎'USING'不能像那样使用;也许这就是为什么downvote。我会编辑我的答案。 – IMSoP 2013-05-08 12:04:15

相关问题