Cómo probar mi SQL ad-hoc con parameters en la window de consulta de Postgres

En Microsoft SQL Server, para probar algo como esto en la window de consulta:

select * from Users where LastName = @lastname 

Puedo agregar esto antes del command:

 declare @lastname varchar(16) set @lastname = 'Troy' 

Pero en PostgreSQL, no puedo encontrar una manera similar de hacerlo. Parece que lo único que puedo hacer es replace el nombre del parámetro directamente con su valor. Se pone difícil cuando la consulta ad-hoc se complica y el mismo parámetro se usa varias veces. ¿Hay alguna manera?

Proporcione parameters en un CTE para tener "variables" en SQL puro :

 WITH var(lastname) AS (SELECT 'Troy'::varchar(16)) SELECT * FROM users , var v WHERE lastname = v.lastname ; 

Esto funciona para cualquier consulta.
Dado que el CTE var contiene una sola fila , es seguro agregarlo con CROSS JOIN al final de la cláusula FROM. De hecho, la forma abreviada que se agrega después de una coma es la mejor, porque la syntax explícita de unión se une antes que las comas. El alias de tabla adicional v es opcional para acortar aún más la syntax.

O use una tabla temporal para cumplir un rol similar para todas las consultas dentro de la misma session. Las tablas de temperatura mueren al final de la session.

 CREATE TEMP TABLE var AS SELECT 'Troy'::varchar(16) AS lastname; ANALYZE var; -- temp tables are not covenetworking by autovacuum! SELECT * FROM users, var v WHERE lastname = v.lastname; 
  • Acerca de tablas temporales y autovacuum

O puede usar declaraciones de DO como @Houari suministradas o como se demuestra aquí:

  • PostgreSQL realiza un bucle fuera de las funciones. ¿Es eso posible?

Tenga en count que no puede devolver valores de las declaraciones de DO . (Sin embargo, puede usar RAISE ... ) Y no puede usar SELECT sin objective en el código plpgsql (el lenguaje de procedimiento pnetworkingeterminado en una statement DO . Reemplazar SELECT con PERFORM para descartar resultados.

O puede usar opciones personalizadas , que puede establecer en postgresql.conf para que sean visibles globalmente .

O configure su session para que sea visible durante la duración de su session (y solo dentro de la misma session) :

 SET my.lastname = 'Troy'; 

El nombre de la variable debe include un punto. Está limitado al text como tipo de datos de esta manera, pero cualquier tipo de datos puede representarse como text

Puede usar current_setting('my.lastname') como expresión de valor. Echar si es necesario. Por ejemplo: current_setting('my.json_var')::json

O use SET LOCAL para que el efecto dure solo para la transacción actual.

Respuesta relacionada por @Craig:

  • Pasar ID de usuario a desencadenantes de PostgreSQL

O puede usar funciones IMMUTABLE simples y minúsculas como variables globales persistentes que solo los usuarios con privilegios pueden manipular:

  • ¿Hay alguna manera de definir una constante con nombre en una consulta de PostgreSQL?

Esta respuesta relacionada también tiene una list similar de opciones.

psql

Ha \set meta-command y proporciona sustitución de variables en el cliente .

pgAdmin

La window de consulta pgAdmin ofrece la extensión pgScript .

Tal vez usando la instrucción DO para simular una function. ¡De esa manera puedes declarar variables y usarlas para ejecutar tu consulta!

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

Configuré postgres para registrar todos los commands y copyr el command del file de logging, por lo que todos los parameters ya están reemplazados por el valor y probar el command en la window de consulta.

Puede que no sea el mejor enfoque, pero es fácil y funciona para mí

    Intereting Posts