SQL Server:case语句中的昂贵查询

时间:2015-02-03 21:10:48

标签: sql-server tsql

我有一个看起来像这样的查询

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很贵。

2 个答案:

答案 0 :(得分:2)

您可以从calculateBestFriend()获取记录并将其存储到cte,然后更新所述ctecte的更新将级联到源表。

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()函数以准确返回您想要的(或创建一个新的)。但是,通常我会避免在查询中使用函数,你会发现通常你可以在没有它们的情况下实现相同的功能。仔细查看您的架构,看看是否可行。