В MS SQL Server я создаю свои сценарии для использования настраиваемых переменных:
DECLARE @somevariable int
SELECT @somevariable = -1
INSERT INTO foo VALUES ( @somevariable )
Затем я изменю значение @somevariable
во время выполнения в зависимости от значения, которое мне нужно в конкретной ситуации. Поскольку он находится в верхней части сценария, его легко увидеть и запомнить.
Как мне сделать то же самое с клиентом PostgreSQL psql
?
sql
postgresql
variables
psql
Крейг Уокер
источник
источник
Ответы:
Переменные Postgres создаются с помощью команды \ set, например ...
... и затем может быть заменен, например, как ...
... или ...
edit: Начиная с psql 9.1, переменные можно раскрывать в кавычках, как в:
В старых версиях клиента psql:
... Если вы хотите использовать переменную в качестве значения в условном строковом запросе, например ...
... тогда вам нужно включить кавычки в саму переменную, так как приведенное выше не будет работать. Вместо этого определите свою переменную как таковую ...
Однако, если вы, как и я, столкнетесь с ситуацией, когда захотите создать строку из существующей переменной, я обнаружил, что уловка будет в следующем ...
Теперь у вас есть переменная в кавычках и без кавычек одной и той же строки! А можно сделать что-то вроде этого ....
источник
\set
предназначен только дляpsql
инструмента, вы не можете использовать его в хранимых процедурах!psql
мета-команды смешиваются с командами\set
PostgreSQL запутанным образом.\set myvariable 'value'
вовсе не включать в себя любую цитату внутри переменной, вопреки тому , что говорит этот ответ. В случае сомнений используйте\echo :myvariable
в psql, чтобы отобразить значение независимо от любого запроса.И последнее слово о переменных PSQL:
Они не расширяются, если вы заключите их в одинарные кавычки в операторе SQL. Таким образом, это не работает:
Чтобы преобразовать в строковый литерал в операторе SQL, вы должны включить кавычки в набор переменных. Однако значение переменной уже должно быть заключено в кавычки, что означает, что вам нужен второй набор кавычек, а внутренний набор должен быть экранирован. Таким образом, вам необходимо:
РЕДАКТИРОВАТЬ : начиная с PostgreSQL 9.1, вы можете вместо этого написать:
источник
:'myvariable'
Вы можете попробовать использовать предложение WITH .
источник
CREATE TABLE test (name VARCHAR, age INT);
INSERT INTO test (name, age) VALUES ('Jack', 21), ('Jill', 20);
WITH vars AS (SELECT N'Jack' AS name, 21 AS age) SELECT test.* FROM test, vars WHERE test.name = vars.name and test.age = vars.age;
Как и ожидалось, Джек и его возраст.create table t(x integer);
insert into t(x) with sub as (select 999 as num) select num from sub;
select * from t;
В частности
psql
, вы также можете передаватьpsql
переменные из командной строки; вы можете передать их с помощью-v
. Вот пример использования:Обратите внимание, что двоеточие не заключено в кавычки, тогда указывается само имя переменной. Странный синтаксис, я знаю. Это работает только в psql; это не будет работать (скажем) в PgAdmin-III.
Эта подстановка происходит во время обработки ввода в psql, поэтому вы не можете (скажем) определить функцию, которая использует,
:'filepath'
и ожидать, что значение:'filepath'
будет изменяться от сеанса к сеансу. Он будет заменен один раз, когда функция определена, и после этого станет константой. Это полезно для написания сценариев, но не для использования во время выполнения.источник
FWIW, настоящая проблема заключалась в том, что я поставил точку с запятой в конце моей команды \ set:
Точка с запятой интерпретировалась как фактический символ в переменной:
Итак, когда я попытался его использовать:
... Получил вот что:
При этом не только не удалось установить кавычки вокруг литерала, но и разбить команду на 2 части (вторая из которых была недействительной, поскольку начиналась с «NOINHERIT»).
Мораль этой истории: «переменные» PostgreSQL - это на самом деле макросы, используемые при расширении текста, а не истинные значения. Я уверен, что это пригодится, но поначалу это сложно.
источник
Вам необходимо использовать один из процедурных языков, например PL / pgSQL, а не язык процедур SQL. В PL / pgSQL вы можете использовать переменные прямо в операторах SQL. Для одинарных кавычек вы можете использовать функцию кавычки.
источник
postgres (начиная с версии 9.0) разрешает анонимные блоки на любом из поддерживаемых языков сценариев на стороне сервера
http://www.postgresql.org/docs/current/static/sql-do.html
Поскольку все находится внутри строки, заменяемые внешние строковые переменные должны быть экранированы и дважды заключены в кавычки. Использование долларовых кавычек вместо этого не даст полной защиты от SQL-инъекций.
источник
Другой подход - (ab) использовать механизм PostgreSQL GUC для создания переменных. См. Предыдущий ответ для получения подробностей и примеров.
Вы объявляете GUC в
postgresql.conf
, затем изменяете его значение во время выполнения с помощьюSET
команд и получаете его значение с помощьюcurrent_setting(...)
.Я не рекомендую это для общего использования, но это может быть полезно в узких случаях, таких как тот, который упоминается в связанном вопросе, когда плакат хотел предоставить способ предоставить имя пользователя на уровне приложения для триггеров и функций.
источник
Я решил это с помощью временной таблицы.
Таким образом, у меня была «переменная», которую я мог использовать для нескольких запросов, уникальную для сеанса. Мне нужно, чтобы он генерировал уникальные «имена пользователей», но при этом не имел коллизий при импорте пользователей с тем же именем пользователя.
источник
Я нашел этот вопрос и ответы чрезвычайно полезными, но также сбивающими с толку. У меня было много проблем с тем, чтобы заставить работать цитируемые переменные, поэтому вот как у меня это работает:
Таким образом, вы можете определить переменную в одном операторе. Когда вы его используете, в переменную будут вставлены одинарные кавычки.
НОТА! Когда я помещал комментарий после цитируемой переменной, он был засосан как часть переменной, когда я пробовал некоторые методы в других ответах. Это действительно какое-то время меня облажало. С этим методом комментарии обрабатываются так, как и следовало ожидать.
источник
\set deployment_pass 'string_password'
ALTER USER :deployment_user WITH PASSWORD :'deployment_pass';
Я очень скучаю по этой функции. Единственный способ добиться чего-то подобного - использовать функции.
Я использовал его двумя способами:
Версия Perl:
Настольная версия:
Ноты:
источник
Переменные в
psql
отстой. Если вы хотите объявить целое число, вы должны ввести целое число, затем выполнить возврат каретки и завершить оператор точкой с запятой. Заметим:Допустим, я хочу объявить целочисленную переменную
my_var
и вставить ее в таблицуtest
:Примерная таблица
test
:Понятно, что в этой таблице пока ничего:
Объявляем переменную. Обратите внимание на точку с запятой на следующей строке!
Теперь мы можем вставить. Мы должны использовать этот "
:''
" странный синтаксис:Это сработало!
Объяснение:
Итак ... что произойдет, если в следующей строке нет точки с запятой? Переменная? Посмотри:
Объявляем
my_var
без новой строки.Выберем
my_var
.Что это за хрень? Это не целое число , это строка
999;
!источник
Я опубликовал новое решение для этого в другом потоке .
Он использует таблицу для хранения переменных и может быть обновлен в любое время. Статическая неизменяемая функция-получатель создается динамически (другой функцией), запускается обновлением вашей таблицы. Вы получаете хорошее хранилище таблиц, а также невероятно высокую скорость неизменяемого геттера.
источник