plpgsql EXECUTE 语句中的嵌套引号

nested quotes in plpgsql EXECUTE statement

我正在用 table 名称作为参数编写 plpgsql 函数来处理我的 postgis 数据库更新任务,但是在 EXECUTE 语句中遇到关于引号中引号的问题。

这是普通的 SQL 脚本,它工作正常:

UPDATE baoluo SET sfzgjsyd='同时落在总规建设用地内外' 
        FROM lu_plan AS lu
        WHERE ST_Overlaps(lu.geom, baoluo.geom) 
        AND lu.is_construc = '建设用地'

在plpgsql中,我对汉字使用了双引号,相关部分代码如下:

CREATE or replace FUNCTION process(_tb1 regclass, town_name TEXT, town_id TEXT) 
RETURNS VOID AS
$func$
DECLARE
   city_name text := '文昌市';  -- assign at declaration
   city_code text := '469005';
BEGIN
    --更新字段:
    EXECUTE format('
        UPDATE %s SET sfzgjsyd="同时落在总规建设用地内外" 
        FROM lu_plan 
        WHERE ST_Overlaps(lu_plan.geom, %s.geom) 
        AND lu_plan.is_construc = "建设用地"', _tb1, _tb1); 
END; 
$func$
LANGUAGE plpgsql;
select process('public.baoluo', '保罗镇', '469005000');

我希望它能正常工作,但日志显示错误 the field not exists

In format() strings, single quotes will get wrong with Chinese characters.

嵌套引号有问题,汉字没有问题。使用美元引号和 %I 作为标识符:

...
EXECUTE format($ex$
    UPDATE %I SET sfzgjsyd= '同时落在总规建设用地内外'
    FROM lu_plan 
    WHERE ST_Overlaps(lu_plan.geom, %I.geom) 
    AND lu_plan.is_construc = '建设用地'
    $ex$, _tb1, _tb1); 
...

我也试过@muistooshort 建议双引号,效果很好。

...
EXECUTE format('
    UPDATE %I SET sfzgjsyd=''同时落在总规建设用地内外'' 
    FROM lu_plan 
    WHERE ST_Overlaps(lu_plan.geom, %I.geom) 
    AND lu_plan.is_construc = ''建设用地''', _tb1, _tb1); 
...