Die Erklärung lautet gemäß dem Handbuch :
Der Körper des DO
Die Anweisung ist eine Zeichenfolge in Dollar-Anführungszeichen. Also keine Interpolation innerhalb des Strings.
Da es sich um eine wörtliche Zeichenfolge handeln muss, können Sie Zeichenfolgen auch nicht im laufenden Betrieb verketten. Das Handbuch:
Aber Sie können den String verketten und dann ausführen.
Fette Hervorhebung von mir. Sie müssen nur richtig zitieren:
test=# \set test 'some value'
test=# \set code 'DECLARE v_test text := ' :'test' '; BEGIN RAISE NOTICE ''test var is: %'', v_test; END'
test=# DO :'code';
NOTICE: test var is: some value
DO
test=#
Aber ich würde lieber eine (temporäre) Funktion erstellen und den Wert als Parameter übergeben (wo die psql-Interpolation funktioniert). Details in dieser verwandten Antwort auf dba.SE: