Как подставить переменные сценария psql в строки в запросе, чтобы он не завершился ошибкой независимо от того, установлена ​​переменная или нет - PullRequest
1 голос
/ 17 июня 2019

То, что я хочу, чтобы один и тот же запрос не завершился неудачей - независимо от того, установлена ​​переменная или нет.Затем, в зависимости от устанавливаемой переменной - возвращая соответствующий вывод.

Вот более или менее то, что я имею в виду / хочу:

--variable not set, returns not substituted string:
SELECT 'solution=:abc' result;
    result     
---------------
 solution=:abc
--variable set:
\set abc 5+7
SELECT 'solution=:abc' result;
    result     
---------------
 solution=5+7

НО INSTEAD в обоих случаях переменная не делаетне подставляйся:

SELECT 'solution=:abc' result;
    result     
---------------
 solution=:abc
--variable set:
\set abc 5+7
SELECT 'solution=:abc' result;
    result     
---------------
 solution=:abc

Я обнаружил, что мне нужно использовать синтаксис 'variable', поэтому

SELECT 'solution=':'abc' result;

, но это дает дополнительный (') знак там:

    result     
---------------
 solution='5+7

и не работает, когда переменная не установлена ​​

\unset abc
SELECT 'solution=':'abc' result;
ERROR:  syntax error at or near ":"
LINE 1: SELECT 'solution=':'abc' result;

Что происходит?

Любой способ заставить это работать в обоих случаях, как описано ввершина?Я на PostgreSQL 9.6.11

1 Ответ

1 голос
/ 18 июня 2019

psql переменная интерполяция с учетом синтаксиса.Если вы хотите использовать переменную

  • дословно, используйте :abc;
  • в качестве строки, используйте :'abc';
  • в качестве идентификатора (например, дляимя таблицы), используйте :"abc" (например, для имени таблицы).

То, что вы пытаетесь сделать, это объединить две строки.Таким образом, синтаксически правильным было бы:

SELECT 'solution=' || :'abc' result;

Объяснение того, почему есть дополнительная кавычка, когда вы делаете

SELECT 'solution=':'abc' result;

, состоит в том, что :'abc' заменяется на '5+7',в результате получается

SELECT 'solution=''5+7' result;

Двойная одинарная кавычка - это то, как вы экранируете одинарную кавычку в строке, то есть одинарную кавычку в вашем выводе.

Что касается того, как заставить запрос работать при наличиипеременная не установлена, я думаю, что вам не повезло.Единственный обходной путь - инициализировать переменную самим именем переменной:

db=# \set abc :abc
db=# SELECT 'solution=' || :'abc' result;
    result
---------------
 solution=:abc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...