Как Вы используете переменные сценария в psql?

Использование создания встроенного списка карт для работы

Код:

map(None,"sart")

Выход:

['s', 'a', 'r', 't']
122
задан Evan Carroll 23 July 2018 в 22:05
поделиться

4 ответа

Переменные Postgres создаются с помощью команды \set, например ...

\set myvariable value

... и затем могут быть заменены, например, как ...

SELECT * FROM :myvariable.table1;

... или ...

SELECT * FROM table1 WHERE :myvariable IS NULL;

edit: Начиная с psql 9.1, переменные могут быть раскрыты в кавычках как в:

\set myvariable value 

SELECT * FROM table1 WHERE column1 = :'myvariable';

В более старых версиях клиента psql:

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

SELECT * FROM table1 WHERE column1 = ':myvariable';

... тогда вам нужно включить кавычки в саму переменную, как указано выше, не получится. Вместо этого определите вашу переменную как таковую...

\set myvariable 'value'

Однако, если, как и я, вы столкнулись с ситуацией, в которой вы хотели создать строку из существующей переменной, я нашел трюк в следующем...

\set quoted_myvariable '\'' :myvariable '\''

Теперь у вас есть переменная в кавычках и без кавычек одной и той же строки! А можно сделать вот так....

INSERT INTO :myvariable.table1 SELECT * FROM table2 WHERE column1 = :quoted_myvariable;
170
ответ дан 24 November 2019 в 01:20
поделиться

Необходимо использовать один из процедурных языков, таких как PL/pgSQL не SQL proc язык. В PL/pgSQL можно использовать Вар прямо в SQL-операторах. Для одинарных кавычек можно использовать функцию литерала кавычки.

12
ответ дан 24 November 2019 в 01:20
поделиться

FWIW, настоящая проблема состояла в том, что я включал точку с запятой в конце своей команды \set:

\set owner_password 'thepassword';

точка с запятой интерпретировалась как фактический символ в переменной:

\echo: owner_password thepassword;

Поэтому, когда я пытался использовать его:

СОЗДАЮТ РОЛЬ myrole ВХОД В СИСТЕМУ НЕЗАШИФРОВАННЫЙ ПАРОЛЬ: owner_password NOINHERIT CREATEDB CREATEROLE, ДОПУСТИМЫЙ ДО 'бесконечности';

... Я получил это:

СОЗДАЮТ РОЛЬ myrole ВХОД В СИСТЕМУ НЕЗАШИФРОВАННЫЙ ПАРОЛЬ thepassword; NOINHERIT CREATEDB CREATEROLE, ДОПУСТИМЫЙ ДО 'бесконечности';

, Которому не только не удалось установить кавычки вокруг литерала, но разделить команду на 2 части (второй из которых был недопустим, поскольку это запустилось с "NOINHERIT").

мораль этой истории: PostgreSQL "переменные" являются действительно макросами, используемыми в текстовом расширении, не истинных значениях. Я уверен, что это пригождается, но это хитро сначала.

13
ответ дан Craig Walker 24 November 2019 в 01:20
поделиться

Одно заключительное слово на переменных PSQL:

  1. Они не расширяются, если Вы включаете их в одинарные кавычки в SQL-операторе. Таким образом это не работает:

    SELECT * FROM foo WHERE bar = ':myvariable'
    
  2. Для расширения до строкового литерала в SQL-операторе необходимо включать кавычки в переменный набор. Однако значение переменной уже должно быть включено в кавычки, что означает, что Вам нужно 113-секундное набор кавычек, и внутреннего набора нужно оставить. Таким образом Вам нужно:

    \set myvariable '\'somestring\''  
    SELECT * FROM foo WHERE bar = :myvariable
    

    РЕДАКТИРОВАНИЕ : начиная с PostgreSQL 9.1, можно записать вместо этого:

    \set myvariable somestring
    SELECT * FROM foo WHERE bar = :'myvariable'
    
58
ответ дан Daniel Vérité 24 November 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: