postgresql “有一个名为的列...无法从查询的此部分引用它,”如何修复此问题?[已关闭]

cgfeq70w  于 2023-01-17  发布在  PostgreSQL
关注(0)|答案(2)|浏览(145)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
9小时前关门了。
Improve this question
这里有一个简单的表,包含abcd列。如果c>0,则d中的值为a+b;如果c<=0,则a-b。我该怎么做?
我试过这段代码,但它不起作用。我怎样才能动态地在表中插入数据?

INSERT INTO my_table VALUES(1,2,3, 
CASE
    WHEN c<0
    THEN a+b
    ELSE a-b
END
)
8mmmxcuj

8mmmxcuj1#

如果C〉0,我想得到D(a + b)的值,如果C〈= 0,我想得到(a-b)的值,我该怎么做呢?
您不能引用值中的列。相反,您需要重复这些值。假设您使用绑定参数在编程语言中发出查询...

insert into my_table(a, b, c, d)
  values(
    $1, $2, $3,
    case
    when $3 > 0 then $1 + $2
    else $1 - $2
  )

也可以编写函数。

--  I want value in D (a+b) if C>0 and (a-b) if C<=0.
create function my_insert(a int, b int, c int)
returns void
language plpgsql
as $$
declare d integer;
begin
  case
  when c > 0 then d = a + b;
  else d = a - b;
  end case;

  insert into my_table ("a", "b", "c", "d") values (a, b, c, d);
end;
$$

select my_insert(1, 2, 3);

Demonstration.

cbeh67ev

cbeh67ev2#

使用文字值时,可以使用子查询实现相同的效果:

INSERT INTO my_table (a,b,c,d) 
SELECT *, CASE WHEN c<0 THEN a+b ELSE a-b END AS d
FROM (
   VALUES
     (3,2, 1)  -- input values here, once
   , (3,2,-1)  -- multiple rows if need be
   ) sub(a,b,c);

这无需对integertext等基本类型进行显式类型转换即可实现,因为假定的文本默认类型恰好匹配。您可能需要在单独的VALUES表达式中对其他数据类型进行显式数据类型转换。请参见:

  • 更新多行时转换NULL类型
    • 更根本的是**,通过不在表中存储冗余数据来避免这个问题。
CREATE TABLE my_table (
  a int
, b int
, c int
--  NO d; will be computed on the fly
);

INSERT回归基本:

INSERT INTO my_table (a,b,c) VALUES
  (3,2, 1)
, (3,2, 0)
, (3,2,-1)
;

附加列d可以廉价地在运行中计算,通常比由于增加的存储而读取更多数据页便宜得多:

SELECT *, CASE WHEN c<0 THEN a+b ELSE a-b END AS d
FROM   my_table;

您可以将逻辑持久化在VIEW中:

CREATE VIEW my_view AS
SELECT *, CASE WHEN c<0 THEN a+b ELSE a-b END AS d
FROM   my_table;

SELECT * FROM my_view;

如果您确实需要计算值 * stored *(例如当计算相对昂贵时,或者您要对列执行其他操作时),请使用STORED generated column(Postgres 12+):

ALTER TABLE my_table
ADD column d int GENERATED ALWAYS AS (CASE WHEN c<0 THEN a+b ELSE a-b END) STORED;

SELECT * my_table;

fiddle
参见:

  • PostgreSQL中的计算/计算/虚拟/派生列

相关问题