1

给定以下架构(例如)

CREATE TABLE "test" (
  "id" int, 
  "title" varchar
);

在 NodeJS 中,我尝试使用以下内容进行更新

client.query(
            'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' +
            'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' +
            'FROM new_vals nv ' +
            'WHERE "t"."id"=nv.id;',
        [1,'test'],
        function(err, res){ ... }
);

它给了我以下错误:'错误:运算符不存在:整数=文本'

好的,让我们尝试停止使用"t"."id"=nv.id并重用一个可用参数:

client.query(
            'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' +
            'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' +
            'FROM new_vals nv ' +
            'WHERE "t"."id"=$1;',
        [1,'test'],
        function(err, res){ ... }
);

仍然'error: operator does not exist: integer = text'

好的,现在让我们添加另一个$3占位符:

client.query(
            'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' +
            'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' +
            'FROM new_vals nv ' +
            'WHERE "t"."id"=$3;',
        [1,'test',1],
        function(err, res){ ... }
);

另一个错误:'错误:列“id”是整数类型,但表达式是文本类型'

我完全迷路了。为什么不使用intWHERE 中的操作符类?这里有什么问题?

奇怪的是,UPDATE没有子句的标准形式WITH工作得很好......

如果您需要使用代码:https ://gist.github.com/kolypto/7455957

4

1 回答 1

2

在这种情况下:

WITH new_vals ("id","title") AS (VALUES($1,$2))

PostgreSQL 不知道什么类型$1$2将是什么类型,因此它们最终将被视为文本值。精美的手册指出

VALUES中使用时INSERT,所有值都会自动强制转换为相应目标列的数据类型。在其他上下文中使用它时,可能需要指定正确的数据类型。

在 中values($1, $2),无法推断类型,因此您必须明确:

WITH new_vals ("id", "title") AS (VALUES($1::integer, $2::text))

演员阵容$2不是必需的,但我喜欢保持一致。

于 2013-11-13T21:05:43.367 回答