我不确定这是否可行,但我尝试做的事情的本质是两个单独的SELECTS
,一个用于单个结果,一个用于两个联合结果。注意:{bracket}中的文本只是一般替换。下面给出了CASE
的语法错误:
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
,但这也给出了语法错误。
答案 0 :(得分: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))