Postgresql:从 select 更新列并在返回多行时添加条件

Postgresql: Update column from select and add condition when multiple rows returned

基本上,我需要使用 SELECT 更新一列,它可以 return 多个值。如果发生这种情况,我想应用第二个条件来确定要选择哪些值:

UPDATE train
SET var1 = (
    CASE
        WHEN (SELECT COUNT(*)
              FROM cars
              WHERE (train.var2 LIKE cars.var2))
             > 1)
        THEN (
            SELECT var1
            FROM cars
            WHERE (train.var2 LIKE cars.var2)
              AND cars.var2 in (
                SELECT var2
                FROM cars
                WHERE train.user_id = cars.user_id)
        )
        ELSE (
            SELECT var1
            FROM cars
        WHERE (train.var2 LIKE cars.var2))
        )
    END
);

我认为上面的方法有效,但我重复了 3 次相同的方法 SELECT。你有避免这种情况的好方法吗?也许有一种简单的方法可以在 select return 超过一个值时捕捉并对此采取一些措施?

谢谢

update train set
  var1 = (
    select cars.var1
    from cars
    where train.var2 like cars.var2
    order by train.user_id = cars.user_id desc
    limit 1);

以上答案很好,开箱即用。如果你做了很多这些,看看:https://wiki.postgresql.org/wiki/First/last_(aggregate)

那么你可以这样做:

update train set
  var1 = (
    select first(cars.var1 order by train.user_id = cars.user_id desc)
    from cars
    where train.var2 like cars.var2
  );

根据您的确切用例,这可能更简洁、更易于阅读、更易于推理(subselect 中的 order by 充满了令人讨厌的边缘案例)或者只是比它的价值更多。