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 充满了令人讨厌的边缘案例)或者只是比它的价值更多。
基本上,我需要使用 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 充满了令人讨厌的边缘案例)或者只是比它的价值更多。