我有一个看起来像这样的查询
UPDATE users u
SET bestFriend = calculateBestFriend(u.birthday, u.hometown, u.pet)
WHERE u.id = 7
问题是,如果没有找到朋友,calculateBestFriend
将返回NULL,如果找到多个最好的朋友,则返回-1。但是,对于用户来说,在任何一种情况下都需要NULL。我无法修改calculateBestFriend
。
我想做这样的事情
UPDATE users u
SET bestFriend =
CASE calculateBestFriend(u.birthday, u.hometown, u.pet)
WHEN -1 THEN NULL
ELSE whateverCameBack
WHERE u.id = 7
我不想这样做
UPDATE users u
SET bestFriend =
CASE
WHEN calculateBestFriend(u.birthday, u.hometown, u.pet) = -1 THEN NULL
ELSE calculateBestFriend(u.birthday, u.hometown, u.pet)
WHERE u.id = 7
因为calculateBestFriend
很贵。
答案 0 :(得分:2)
您可以从calculateBestFriend()
获取记录并将其存储到cte
,然后更新所述cte
。 cte
的更新将级联到源表。
WITH cte AS
(
SELECT *, calculateBestFriend(u.birthday, u.hometown, u.pet) as calculatedBestFriend
FROM users u
WHERE u.id = 7
)
UPDATE cte
SET cte.bestFriend =
CASE
WHEN cte.calculatedBestFriend = -1 THEN NULL
ELSE cte.calculatedBestFriend
END
答案 1 :(得分:0)
一种显而易见的方法是更改您的calculateBestFriend()函数以准确返回您想要的(或创建一个新的)。但是,通常我会避免在查询中使用函数,你会发现通常你可以在没有它们的情况下实现相同的功能。仔细查看您的架构,看看是否可行。