PostgreSQL dblink 如何转义单引号

15

相关链接:

这是我的错误:

ERROR:  type "e" does not exist

这是我的查询:

SELECT *
FROM dblink('host=theHostName port=1234 dbname=theDBName user=theUser password=thePassword',
    E'SELECT field_1, 
    CASE WHEN field_2 IS NOT NULL 
    THEN \'inactive\' ELSE \'active\' 
    END AS field_status 
    FROM the_table 
     ') 
AS linkresults(field_1 varchar(20),field_2 varchar(8))

如果我使用双引号,请删除单引号的反斜杠转义符,并在SELECT语句之前删除E。

SELECT *
FROM dblink('host=theHostName port=1234 dbname=theDBName user=theUser password=thePassword',
    "SELECT field_1, 
    CASE WHEN field_2 IS NOT NULL 
    THEN 'inactive' ELSE 'active' 
    END AS field_status 
    FROM the_table 
     ") 
AS linkresults(field_1 varchar(20),field_2 varchar(8))

我得到了这个:

NOTICE:  identifier "SELECT ..." will be truncated

我也遇到了错误,提示我的查询被截断。

之前我已经使用过类似 dblink 的转义方式,并且正常工作,所以是否需要配置服务器设置或其他内容呢?

我知道如果在 SQL 服务器本身上运行查询是没有问题的,但是在使用 dblink 时出现了错误。有什么想法吗?

Postgres 版本为 8.4。


@niktrs 你的帖子有效,为什么要删除? - Phill Pafford
我已经将其更新为更简单的内容。如果不起作用,我可以报告先前的答案。 - niktrs
2个回答

34

尝试将\'inactive\'替换为''inactive'' -- 注意:两个单引号。

   SELECT *
    FROM dblink('host=theHostName port=1234 dbname=theDBName user=theUser password=thePassword',
        'SELECT field_1, 
        CASE WHEN field_2 IS NOT NULL 
        THEN ''inactive'' ELSE ''active'' 
        END AS field_status 
        FROM the_table 
         ') 

AS linkresults(field_1 varchar(20),field_2 varchar(8))

替代(之前的)解决方案

   SELECT *
    FROM dblink('host=theHostName port=1234 dbname=theDBName user=theUser password=thePassword',
        'SELECT field_1, 
        CASE WHEN field_2 IS NOT NULL 
        THEN E\'inactive\' ELSE E\'active\' 
        END AS field_status 
        FROM the_table 
         ') 

AS linkresults(field_1 varchar(20),field_2 varchar(8))

告诉我替代方案是否可行。想知道,因为我的电脑上没有安装PostgreSQL。 - niktrs
“E'inactive'这个解决方案对我也起作用了,你提供的另一个使用两个单引号''的解决方案也可以。” - Phill Pafford
你也可以使用$$样式的引号。 - Scott Marlowe

6

尝试使用以下查询:

SELECT *
 FROM dblink('host=theHostName port=1234 dbname=theDBName user=theUser password=thePassword',
 'SELECT field_1, 
 CASE WHEN field_2 IS NOT NULL 
 THEN $$inactive$$ ELSE $$active$$ 
 END AS field_status 
 FROM the_table') 
 AS linkresults(field_1 varchar(20),field_2 varchar(8))

1
提供更多上下文并使用代码块将改善此答案。 - Jordan Dea-Mattson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接