1

我希望能够根据输入参数的值选择表中的哪个字段由我的存储过程更新。如果输入字段等于“草稿”,则应更新id_draft,否则应更新id。这可能吗?

这是我失败的尝试之一,可能有助于说明我想要做什么:

CREATE OR REPLACE PROCEDURE sp_test (input_field VARCHAR DEFAULT NULL)
 IS
   BEGIN
      UPDATE TABLE
      SET
        CASE
            WHEN input_field = 'draft' THEN id_draft
            ELSE id
   END = 'x'
4

1 回答 1

2

您不能使用 CASE 语句来更改查询结构本身。它只返回数据,它是一个函数。

您所拥有的 ( CASE WHEN input_field = 'draft' then id_draft ELSE id END) 返回字段或字段中的。好像在做这个...idid_draft

UPDATE
  yourTable
SET
  CASE WHEN 'abc' = 'draft' THEN 123 ELSE 789 END = 'x'

相反,您需要将 CASE 语句放在右侧...

UPDATE
  yourTable
SET
  id       = CASE WHEN input_field = 'draft' THEN id  ELSE 'x'      END,
  id_draft = CASE WHEN input_field = 'draft' THEN 'x' ELSE id_draft END

但是,实际上,你这样做可能会更好......

IF (input_field = 'draft')
  UPDATE yourTable SET id_draft = 'x'
ELSE
  UPDATE yourTable SET id = 'x'

编辑:*

要使用另一个表中的值而不是 just 'x',您可以使用类似这样的东西......

UPDATE
  yourTable
SET
  id       = CASE WHEN input_field = 'draft' THEN yourTable.id  ELSE otherTable.x       END,
  id_draft = CASE WHEN input_field = 'draft' THEN otherTable.x  ELSE yourTable.id_draft END
FROM
  otherTable
WHERE
  otherTable.a=? AND otherTable.b=?
于 2012-07-12T09:01:28.793 回答