如何在Postgres中为表中的虚拟列创建数据库链接?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Postgres中为表中的虚拟列创建数据库链接?相关的知识,希望对你有一定的参考价值。

我有一个使用dblink的Oracle Query,

SELECT * FROM  SSP2_PCAT.PRODUCT_TYPES WHERE ( PRODUCT_TYPE) IN 
(SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES
MINUS
SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES@FPORDDEV);

现在我使用dblink将其转换为Postgres,如下所示,

SELECT * FROM  SSP2_PCAT.PRODUCT_TYPES WHERE (PRODUCT_TYPE) IN 
(SELECT PRODUCT_TYPE FROM SSP2_PCAT.PRODUCT_TYPES
EXCEPT 
SELECT * from dblink 
('dbname=NTE5OFF port=5432 host=xxxxx 
  user=yyyyy password=zzzzz','SELECT PRODUCT_TYPE FROM 
  SSP2_PCAT.PRODUCT_TYPES')
as t (PRODUCT_TYPE character varying(60)) );

现在这个工作绝对精细!

现在,我如何将以下相同的Oracle sql转换为虚拟列,如下所示,

SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND
FROM SSP2_PCAT.ACCT_LVL_SALES_CDS
EXCEPT 
SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND
FROM SSP2_PCAT.ACCT_LVL_SALES_CDS@FPORDDEV;

我在Postgres中尝试了如下代码,但显然它给出了虚拟列的错误,

SELECT 'ITO' FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND FROM 
SSP2_PCAT.ACCT_LVL_SALES_CDS
EXCEPT 
SELECT * FROM dblink 
('dbname=NTE5OFF port=5432 host=xxxxx 
user=yyyyy password=zzzzz', 
'SELECT FRM, SALES_CD, SALES_CODE_DESC, ACTIVE_IND FROM 
SSP2_PCAT.ACCT_LVL_SALES_CDS')
as t ( FRM varchar,
   sales_cd character varying(15),
       sales_code_desc character varying(150),
       active_ind character varying(3) ) );

如果我在这里遗漏任何东西,有人可以告诉我吗?

答案

你必须这样做

SELECT 'ITO' FRM ...

在dblink查询中,但由于它是在一个字符串中,你必须加倍单引号来转义它们:

'SELECT ''ITO'' FRM ...'

但是使用postgres_fdw的外表会更简单。

以上是关于如何在Postgres中为表中的虚拟列创建数据库链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postgres 中为 UUID 主键列设置默认值?

在 Node.js 中为 postgres 表中的每一行以不同的间隔为每一行运行重复任务

当数据库为表中的一列返回空值时如何处理错误

Oracle过程增加字符串数据类型并将其存储为表中的列之一

为表中的 nvarchar 列填充零

为表中的特定列设置最大 sizehint