【问题标题】:Convert SQL-Server specific INSERT query to PostgreSQL将 SQL-Server 特定的 INSERT 查询转换为 PostgreSQL
【发布时间】:2025-12-03 09:30:01
【问题描述】:

我有一个特定于 SQL Server 2008 的查询,如何在 PostgreSQL 中执行相同的查询。

INSERT INTO profile_answers_new (pro_ans_frn_pro_id, pro_ans_name)
SELECT pro_ans_frn_pro_id = @new_pro_id , pro_ans_name
FROM profile_answers_old WHERE profile_id = 1

如何将此查询转换为特定于 PostgreSQL 的查询。

【问题讨论】:

  • 唯一的非标准部分是pro_ans_frn_pro_id = @new_pro_id。那应该怎么做?
  • 是的,这是此查询中的唯一问题,该参数 @new_pro_id 是一个变量,其中包含一个值,该值将在 profile_answers_old 表的 pro_ans_frn_pro_id 列中分配,然后插入 pro_ans_frn_pro_id。跨度>
  • 那可能只是select @new_pro_id, ...。我看不到任务的目的。

标签: sql-server postgresql postgresql-9.1 sql-insert


【解决方案1】:

PostgreSQL 的普通 SQL 中没有变量。您可以将文字常量按原样写入SELECT 语句。

INSERT INTO profile_answers_new (pro_ans_frn_pro_id, pro_ans_name)
SELECT 1234, pro_ans_name     -- 1234 being @new_pro_id (integer)
FROM   profile_answers_old
WHERE  profile_id = 1

您在原始语句 (pro_ans_frn_pro_id = @new_pro_id) 中的表达式将被评估为 TRUE / FALSE / NULL。你当然不希望这样。

如果你想提交一个参数,你必须创建一个类似的函数:

CREATE OR REPLACE FUNCTION foo(int)
  RETURNS void LANGUAGE sql AS
$func$
INSERT INTO profile_answers_new (pro_ans_frn_pro_id, pro_ans_name)
SELECT $1, pro_ans_name
FROM   profile_answers_old
WHERE  profile_id = 1;
$func$;

呼叫:

SELECT foo(1234);

但我怀疑,这就是你想要的。

【讨论】:

  • 我不能为这种类型的查询创建函数,因为我的应用程序包含数百个这样的查询。
最近更新 更多