【问题标题】:Postgres CASE Statement in an insert插入中的 Postgres CASE 语句
【发布时间】:2022-05-23 08:53:25
【问题描述】:

我有一张必须在 Postgres 中更改的表。我现在想根据条件为表中存在的行插入一些值。我正在考虑使用 CASE 块!

这是我所拥有的:

INSERT INTO MyTable (value1, value2) values
    (1, SELECT t.name,
          CASE WHEN t.name IN ('MyName') THEN 1
          ELSE 2
        END AS value2
       FROM MyTable t);

我收到一个错误:

ERROR: syntax error at or near "select"
SQL state: 42601
Character: 71

有什么线索吗?

【问题讨论】:

  • 两件事:如果您使用选择插入,则不需要“值”语句。您的表中似乎也有两列,并试图插入三个值 - 1、t.name 和您的 case 语句。您只想插入 t.name 和 case 语句吗?
  • 我想检查名称是什么,并基于此我想插入 1 或 2。我只想插入两列
  • 基本上,我正在尝试用这两列的值更新我的表
  • 在这种情况下您确定不想要 UPDATE 查询吗?
  • 是的,我想 UPDATE 查询很适合

标签: postgresql


【解决方案1】:

好的,这是语法固定的插入查询

 INSERT INTO MyTable (value1, value2) 
        SELECT t.name,
              CASE WHEN t.name IN ('MyName') THEN 1
              ELSE 2
            END AS value2
           FROM MyTable;

如果您尝试更改现有行,则需要更新查询,例如

-- first update, set value1 to 1 and value2 for all rows
UPDATE MyTable set value1 = 1,value2 = 2;

-- next query. Set value2 = 1 for only those rows matching your criteria
 UPDATE MyTable
    SET value2 = 1 WHERE name IN ('MyName');

【讨论】:

  • 我想要的是 case 条件仅适用于 value2。对于 value1,我有一个要插入的默认值
  • 我会使用两个更新(甚至为您的列设置默认值)。第一个更新设置您的默认值(更新 mytable 设置 value1 = 1),第二个只匹配您的条件。
【解决方案2】:

这些都有效。希望有帮助

select ('true'::boolean)::integer;
select ('t'::boolean)::integer;
select (true::boolean)::integer;

【讨论】:

  • 这似乎没有回答问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多