Использование создания встроенного списка карт для работы
Код:
map(None,"sart")
Выход:
['s', 'a', 'r', 't']
Переменные 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;
Необходимо использовать один из процедурных языков, таких как PL/pgSQL не SQL proc язык. В PL/pgSQL можно использовать Вар прямо в SQL-операторах. Для одинарных кавычек можно использовать функцию литерала кавычки.
FWIW, настоящая проблема состояла в том, что я включал точку с запятой в конце своей команды \set:
\set owner_password 'thepassword';
точка с запятой интерпретировалась как фактический символ в переменной:
\echo: owner_password thepassword;
Поэтому, когда я пытался использовать его:
СОЗДАЮТ РОЛЬ myrole ВХОД В СИСТЕМУ НЕЗАШИФРОВАННЫЙ ПАРОЛЬ: owner_password NOINHERIT CREATEDB CREATEROLE, ДОПУСТИМЫЙ ДО 'бесконечности';
... Я получил это:
СОЗДАЮТ РОЛЬ myrole ВХОД В СИСТЕМУ НЕЗАШИФРОВАННЫЙ ПАРОЛЬ thepassword; NOINHERIT CREATEDB CREATEROLE, ДОПУСТИМЫЙ ДО 'бесконечности';
, Которому не только не удалось установить кавычки вокруг литерала, но разделить команду на 2 части (второй из которых был недопустим, поскольку это запустилось с "NOINHERIT").
мораль этой истории: PostgreSQL "переменные" являются действительно макросами, используемыми в текстовом расширении, не истинных значениях. Я уверен, что это пригождается, но это хитро сначала.
Одно заключительное слово на переменных PSQL:
Они не расширяются, если Вы включаете их в одинарные кавычки в SQL-операторе. Таким образом это не работает:
SELECT * FROM foo WHERE bar = ':myvariable'
Для расширения до строкового литерала в SQL-операторе необходимо включать кавычки в переменный набор. Однако значение переменной уже должно быть включено в кавычки, что означает, что Вам нужно 113-секундное набор кавычек, и внутреннего набора нужно оставить. Таким образом Вам нужно:
\set myvariable '\'somestring\''
SELECT * FROM foo WHERE bar = :myvariable
РЕДАКТИРОВАНИЕ : начиная с PostgreSQL 9.1, можно записать вместо этого:
\set myvariable somestring
SELECT * FROM foo WHERE bar = :'myvariable'