如何在UPDATE查询中的SELECT之前的FROM之后使用CASE语句

时间:2017-02-24 21:18:23

标签: sql postgresql sql-update case

我不确定这是否可行,但我尝试做的事情的本质是两个单独的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,但这也给出了语法错误。

1 个答案:

答案 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))