2017-07-08 99 views
0

我有这个问题,如果copy_on_write.id没有记录,那么UPDATE listings SET images = (SELECT images FROM new_vals)运行并消除listings.images什么也没有。CASE,什么时候,然后在更新

所以,我试图使用一个条件来只运行UPDATE listings如果copy_on_write.images存在。

现在我得到:

psql:queries/copy-to-source.sh:20: ERROR: syntax error at or near "CASE" 
LINE 10:  CASE WHEN images <> 

WITH 
    new_vals AS (
    SELECT * 
    FROM copy_on_write 
    WHERE copy_on_write.posted_by = 102550922::text 
     AND copy_on_write.id = 4 
), 

    updates AS (
    SELECT images FROM new_vals, 
     CASE WHEN images <> '' 
     THEN UPDATE listings SET images = (SELECT images FROM new_vals) 
     END 
) 
SELECT internal_id FROM new_vals 

回答

4

您可以使用updates CTE这样的:

... 
updates AS (
    UPDATE listings SET 
    images = new_vals.images 
    FROM new_vals 
    WHERE new_vals.images <> '' 
) 
.... 

注意,即:

  • 您的new_vals CTE应该总是返回最多一条记录,否则这将无法正确工作。

  • 此外,这并不更新listings表,如果new_vals返回图像列,但它是空字符串(或空)。如果在这种情况下,无论如何您都需要运行更新,然后根本删除WHERE new_vals.images <> ''

  • 此外,此声明将更新所有listings.images记录。你真的想要这个吗?

相关问题