Как проверить мой специальный SQL с параметрами в окне запроса Postgres
В Microsoft SQL Server, чтобы проверить что-то вроде этого в окне запроса:
select * from Users where LastName = @lastname
Я могу добавить это перед командой:
declare @lastname varchar(16)
set @lastname = 'Troy'
Но в PostgreSQL я не могу найти аналогичный способ сделать это. Кажется, единственное, что я могу сделать, это заменить имя параметра напрямую на его значение. Сложно, когда сложный запрос усложняется, и один и тот же параметр используется несколько раз. Есть ли способ?
3 ответа
Я настраиваю postgres для регистрации всех команд и копирую команду из файла журнала, чтобы все параметры уже были заменены значением, и проверяю команду в окне запроса.
Может быть, не самый лучший подход, но это легко и работает для меня
Различные варианты.
Укажите параметры в CTE, чтобы иметь "переменные" в чистом SQL:
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Это работает для любого запроса.
Так как CTE var
содержит одну строку, это безопасно добавить его с CROSS JOIN
в конце предложения FROM - на самом деле короткая форма с добавлением ее после запятой может быть лучше, потому что явный синтаксис соединения связывает перед запятыми. Дополнительный псевдоним таблицы v
необязательно для дальнейшего сокращения синтаксиса.
ИЛИ дешевле без CTE. Кстати, почему varchar(16)
? Просто используйте text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname);
Или используйте временную таблицу, чтобы играть аналогичную роль для всех запросов в одном сеансе. Временные таблицы умирают с окончанием сеанса.
CREATE TEMP TABLE var AS
SELECT text 'Troy' AS lastname;
ANALYZE var; -- temp tables are not covered by autovacuum
SELECT * FROM users JOIN var USING (lastname);
- О временных таблицах и
autovacuum
Или вы можете использовать DO
утверждения типа @Houari или как показано здесь:
Обратите внимание, что вы не можете вернуть значения из DO
заявления. (Ты можешь использовать RAISE ...
хотя.) И вы не можете использовать SELECT
без цели в plpgsql - процедурный язык по умолчанию в DO
заявление. замещать SELECT
с PERFORM
выбросить результаты.
Или вы можете использовать индивидуальные параметры, которые вы можете установить в postgresql.conf
быть видимым во всем мире.
Или установите в своем сеансе, чтобы быть видимым на время сеанса и только в том же сеансе:
SET my.lastname = 'Troy';
Имя переменной должно содержать точку. Вы ограничены text
в качестве типа данных таким образом, но любой тип данных может быть представлен как text
...
Ты можешь использовать current_setting('my.lastname')
как выражение значения. В ролях, если вам нужно. Например: current_setting('my.json_var')::json
...
Или использовать SET LOCAL
чтобы эффект длился только для текущей транзакции.
Связанный ответ @Craig:
Или вы можете использовать крошечные IMMUTABLE
функционирует как глобальные постоянные переменные, которыми могут манипулировать только привилегированные пользователи:
У этого связанного ответа также есть подобный список вариантов.
PSQL
имеет \set
или же \gset
мета-команды и обеспечивает подстановку переменных в клиенте.
pgAdmin
Окно запроса pgAdmin предлагает расширение pgScript.
Возможно, используя инструкцию DO для имитации функции. Таким образом, вы можете объявить переменные и использовать их для выполнения вашего запроса!