【问题标题】:PostgreSQL UPDATE with conditional带有条件的 PostgreSQL 更新
【发布时间】:2021-06-22 14:54:09
【问题描述】:
UPDATE vaccine SET country_code = CASE
WHEN vaccine_country='Germany' THEN  country_code ='DE'
WHEN vaccine_country='United States'THEN country_code='US'
WHEN vaccine_country='China' THEN country_code='CN'
WHEN vaccine_country='Turkey' THEN country_code='TR'
WHEN vaccine_country='Russia' THEN country_code='RU'
END

我有一个这样的查询,query 工作正常,但执行查询后表没有更新

【问题讨论】:

  • 疫苗表中是否有诸如vaccine_country='Germany'、'Russia'之类的值?

标签: sql postgresql sql-update


【解决方案1】:

CASE 表达式返回单个 ,它不能替代赋值。

您当前的 THEN 表达式都返回一个 boolean 表达式,它将 country_code 列的(当前)值与右侧的常量进行比较。您需要在 CASE 表达式中删除与目标列的比较:

UPDATE vaccine 
  SET country_code = CASE
                      WHEN vaccine_country='Germany' THEN 'DE'
                      WHEN vaccine_country='United States' THEN 'US'
                      WHEN vaccine_country='China' THEN 'CN'
                      WHEN vaccine_country='Turkey' THEN 'TR'
                      WHEN vaccine_country='Russia' THEN 'RU'
                    END

或者更短一点:

UPDATE vaccine 
  SET country_code = CASE vaccine_country
                      WHEN 'Germany' THEN 'DE'
                      WHEN 'United States' THEN 'US'
                      WHEN 'China' THEN 'CN'
                      WHEN 'Turkey' THEN 'TR'
                      WHEN 'Russia' THEN 'RU'
                    END

另一种选择是为映射提供 VALUES 子句而不是 CASE 表达式:

UPDATE vaccine 
   SET country_code = t.country_code
FROM ( 
  values 
     ('Germany', 'DE'), 
     ('United States' , 'US'),
     ('China' , 'CN')
     ('Turkey' , 'TR')
     ('Russia' , 'RU')
) AS t(country, country_code)
where vaccine.country = t.country;

请注意,对于 vaccine_country 不包含任何所列国家/地区的行,country_code 将设置为 NULL,这可能是您想要的,也可能不是。

【讨论】:

    【解决方案2】:

    去掉THEN之后的country_code

    UPDATE vaccine SET country_code = CASE
      WHEN vaccine_country='Germany' THEN  'DE'
      WHEN vaccine_country='United States'THEN 'US'
      WHEN vaccine_country='China' THEN 'CN'
      WHEN vaccine_country='Turkey' THEN 'TR'
      WHEN vaccine_country='Russia' THEN 'RU'
    END;
    

    演示:db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-15
      • 2013-11-04
      • 2018-09-22
      • 1970-01-01
      • 2012-02-13
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多