我需要将为MS SQL Server 2005编写的SQL查询迁移到Postgres 9.1

SELECT *
FROM V_CitizenVersions         
CROSS APPLY     
       dbo.GetCitizenRecModified(Citizen, LastName, FirstName, MiddleName,
BirthYear, BirthMonth, BirthDay, ..... ) -- lots of params

GetCitizenRecModified()函数是一个表值函数.我不能放置这个函数的代码,因为它非常庞大,会进行一些困难的计算,我不能放弃它.

推荐答案

在Postgres 9.3或更高版本中,使用100连接:

SELECT v.col_a, v.col_b, f.*  -- no parentheses, f is a table alias
FROM   v_citizenversions v
LEFT   JOIN LATERAL f_citizen_rec_modified(v.col1, v.col2) f ON true
WHERE  f.col_c = _col_c;

为什么是LEFT JOIN LATERAL ... ON true


对于older versions,有一种非常简单的方法可以通过设置返回函数(RETURNS TABLE or RETURNS SETOF record OR RETURNS record)来完成I think的任务:

SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM   v_citizenversions v

函数为外部查询的每一行计算一次值.如果函数返回多行,则结果行将相应相乘.所有parentheses are syntactically required个元素都用于分解一个行类型.table函数可以如下所示:

CREATE OR REPLACE FUNCTION f_citizen_rec_modified(_col1 int, _col2 text)
  RETURNS TABLE(col_c integer, col_d text)
  LANGUAGE sql AS
$func$
SELECT s.col_c, s.col_d
FROM   some_tbl s
WHERE  s.col_a = $1
AND    s.col_b = $2
$func$;

如果要应用WHERE子句,因为列在同一级别上不可见,则需要将其包装在子查询或CTE中.(不管怎样,这对性能更好,因为你需要为函数的每个输出列计算prevent repeated evaluation):

SELECT col_a, col_b, (f_row).*
FROM  (
   SELECT col_a, col_b, f_citizen_rec_modified(col1, col2) AS f_row
   FROM   v_citizenversions v
   ) x
WHERE (f_row).col_c = _col_c;

还有其他几种方法可以做到这一点或类似的事情.这完全取决于你到底想要什么.

Postgresql相关问答推荐

Org.postgresql.util.PSQLException:错误:函数LOWER(BYTEA)不存在

为什么在使用PostGIS时,英国郡的几何图形会出现在几内亚湾?

为什么不能超过 10 个并发连接到 Postgres RDS 数据库

Postgres 14 反斜杠 Z 没有给出正确的输出

如何将 JSONB 对象数组合并为 PostgreSQL 中的单个对象

从网址获取第一个字符串

连接 Supbase Postgresql 数据库时,Stepzen Graphiql 资源管理器中的主机名解析错误

如何将 NULL 值插入 UUID 而不是零

在 PostgreSQL 中返回插入的行

如何更改几何列的 SRID?

将 Postgres 与 Grails 一起使用

postgresql:致命:password authentication failed for user "douglas"

在 PostgreSQL 中的表上禁用 DELETE?

如何启动 Postgres 服务器?

如何语法判断 PostgreSQL 配置文件?

try 为 ror 应用程序设置 postgres,出现错误 - fe_sendauth:no password supplied

Postgres Npgsql 连接池

pgadmin 错误:no password supplied

在 Postgres 9.0+ 中使用 PL/pgSQL 在表上循环

如何为本地 Rails 元素设置 Postgres 数据库?