2017-02-24 125 views
1

我不知道这是可能的,但我想要做的事情的本质是有两个单独的SELECTS,一个用于单个结果,一个为两个结果的联合。注意:{括号}中的文字只是一个通用的替换。下面让我在CASE语法错误:如何在FROM之前使用CASE语句SELECT之前在更新查询

UPDATE MySchema.MyTable as MyTable 
SET {column_names} = {new values} 
FROM 
CASE 
    WHEN {case A} THEN 
     (SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {conditions} 
     LIMIT 1) 
    ELSE 
     ((SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {conditions} 
     LIMIT 1) 
     UNION 
     (SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {other_conditions} 
     LIMIT 1)) 
END CASE; 
AS MyOtherTable 
WHERE MyTable.product_id = MyOtherTable.product_id 

我有这个查询与UPDATE工作 - SET - 内每个两种情况重复FROM部分,但我试图削减了冗余的查询如果可能的话。我也尝试在每种情况下移动FROM,但这也给语法错误。

回答

1

您不能使用case表达式将语句中使用的对象放在一起。你可以,但是,使用逻辑运算符来模拟这种结构,所以用{other_conditions}值仅用于如果{case A}不会发生:

UPDATE MySchema.MyTable as MyTable 
SET {column_names} = {new values} 
FROM 
((SELECT {column_names} 
FROM MySchema.MyOtherTable 
WHERE {conditions} 
LIMIT 1) 
UNION 
(SELECT {column_names} 
FROM MySchema.MyOtherTable 
WHERE (NOT ({case A})) AND ({other_conditions}) -- Here! 
LIMIT 1)) 
+1

类似的是,我会考虑的东西。这是在一个触发器函数内,而情况A是当'OLD'中的值为NULL时,或者'NEW'和'OLD'中的值相同时。因为更新正在修复单个行或同一行加上另一行。我担心从简单包含联合选择开始会有太多的开销,但我没有考虑到'NOT {case A}'逻辑。谢谢! –

相关问题