如何在FROM之前使用CASE语句SELECT之前在更新查询
问题描述:
我不知道这是可能的,但我想要做的事情的本质是有两个单独的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
,但这也给语法错误。
答
您不能使用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))
类似的是,我会考虑的东西。这是在一个触发器函数内,而情况A是当'OLD'中的值为NULL时,或者'NEW'和'OLD'中的值相同时。因为更新正在修复单个行或同一行加上另一行。我担心从简单包含联合选择开始会有太多的开销,但我没有考虑到'NOT {case A}'逻辑。谢谢! –