Как проверить мой специальный 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);

Или вы можете использовать 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 для имитации функции. Таким образом, вы можете объявить переменные и использовать их для выполнения вашего запроса!

http://www.postgresql.org/docs/9.4/static/sql-do.html

Другие вопросы по тегам