【问题标题】:Case statement inside create-tablecreate-table 中的 case 语句
【发布时间】:2012-12-12 07:34:32
【问题描述】:

在创建表/列时如何在 SQL => PostgreSQL 中使用“java if-statement”?

    CREATE TABLE Store(
           Discount INT 
                AS CASE 
         WHEN SOLD_Amount>100000 THEN 2
         WHEN SOLD_Amount>500000 THEN 5
         WHEN SOLD_Amount>1000000 THEN 10
         ELSE 0
     END       
           NOT NULL)

这可能是错误的,请告诉我们,社区如何进行这种操作。

【问题讨论】:

  • 我认为你在这里寻找的是一个计算列..

标签: sql postgresql create-table


【解决方案1】:

您在此处查找的是计算列,Postgres 不直接支持该列。您可以在视图中实现它,如下所示:

CREATE VIEW someview AS
SELECT SOLD_Amount,
     CASE 
         WHEN SOLD_Amount>100000 THEN 2
         WHEN SOLD_Amount>500000 THEN 5
         WHEN SOLD_Amount>1000000 THEN 10
         ELSE 0
     END As Discount

或者您可以使用触发器在插入/更新时填充列。

【讨论】:

    【解决方案2】:

    您可以使用特殊的 PostgreSQL 功能:“生成”列。

    基于现有表,例如:

    CREATE TABLE store (sold_amount int, ...):
    

    您可以创建这个特殊功能:

    CREATE FUNCTION store_sold_amount(rec store)
      RETURNS int LANGUAGE SQL IMMUTABLE
    AS
     $func$
     SELECT CASE
             WHEN rec.sold_amount > 100000 THEN 2
             WHEN rec.sold_amount > 500000 THEN 5
             WHEN rec.sold_amount > 1000000 THEN 10
             ELSE 0 END;
     $func$;
    

    然后就可以查询了:

    SELECT s.amount, s.store_sold_amount
    FROM   store s;
    

    更多相关问题:
    How can I create a column in postgres from values and selections based on other columns?
    Store common query as column?

    【讨论】:

    • 这是最好的解决方案,大家可以在Store的create table语句中使用这个功能吧?
    • 小错误:THEN THEN
    • @MrMe 否。您可以在 create 语句中为列设置默认值。但是from the manual值是任意无变量表达式(不允许子查询和对当前表中其他列的交叉引用)
    • @MrMeTumbsUp:这不能在CREATE 语句中使用。功能相关的值没有保存,它是在查询中动态生成的。对于冗余存储,我会使用 trigger。不过,您必须观察一些可能发生的情况才能使您的价值保持最新。基表中的冗余存储通常不是一个好主意,但也有例外......
    最近更新 更多