Uso de consultas avanzadas y parámetros para crear una instrucción SQL dinámica

Un usuario Pregunto ✅

gcam032

I,

Tengo una conexión ODBC a una gran fuente de datos (Impala). Los datos son grandes y necesito crear dinámicamente la instrucción SQL en función de algunos parámetros.

Parámetros:

Año1 = 2019

Año2 = 2020

ListaMes1 = 10,11,12

listamensual2 = 1

SQL dinámico en pseudocódigo:

Seleccione *

de db1.table1

Si la duración del Año2 > 0, entonces wherecls = «where ((año = «&Año1&» y mes = «&ListaMes1&») o (año = «&Año2&» y mes = «&ListaMes2&»))»

else wherecls = «where year = «&Year1&» and month = «&Monthlist1&»»

Espero que quede claro. Básicamente, necesito modificar la consulta SQL que paso a la fuente dinámicamente en función de la presencia o ausencia de datos en ciertos parámetros.

Gracias

gcam032

Encontré una solución a través de prueba y error.

Tomó un enfoque de dos pasos:

1. Cree una consulta para generar una cláusula where dinámica:

let
WhrCls = if Text.Length(Year1) = 4 and Text.Length(Year2) = 4 then


"where ((year = "&Year1&" and month in ("&#"Month LIst 1 (comma separated values)"&"))
or (year = "&Year2&" and month in ("&#"Month List 2 (comma separated values)"&")))"

else if Text.Length(Year1) = 4 and Text.Length(Year2) is null then


"where (year = "&Year1&" and month in ("&#"Month LIst 1 (comma separated values)"&"))"

else


"where (year = "&Year2&" and month in ("&#"Month List 2 (comma separated values)"&"))"


in
WhrCls

2. Usé este resultado de consulta en mi consulta de base de datos:

select *
from "&dbname&".table1
"&DynamicWhereClause&"

Me imagino que puedes hacer esto en un solo paso, pero esto para mí es un poco más limpio y fácil de administrar. ¡Funciona bien!

Gareth

gcam032

Encontré una solución a través de prueba y error.

Tomó un enfoque de dos pasos:

1. Cree una consulta para generar una cláusula where dinámica:

let
WhrCls = if Text.Length(Year1) = 4 and Text.Length(Year2) = 4 then


"where ((year = "&Year1&" and month in ("&#"Month LIst 1 (comma separated values)"&"))
or (year = "&Year2&" and month in ("&#"Month List 2 (comma separated values)"&")))"

else if Text.Length(Year1) = 4 and Text.Length(Year2) is null then


"where (year = "&Year1&" and month in ("&#"Month LIst 1 (comma separated values)"&"))"

else


"where (year = "&Year2&" and month in ("&#"Month List 2 (comma separated values)"&"))"


in
WhrCls

2. Usé este resultado de consulta en mi consulta de base de datos:

select *
from "&dbname&".table1
"&DynamicWhereClause&"

Me imagino que puedes hacer esto en un solo paso, pero esto para mí es un poco más limpio y fácil de administrar. ¡Funciona bien!

Gareth

VasTg

@gcam032

Consulte estas publicaciones.

https://community.powerbi.com/t5/Desktop/How-do-I-pass-parameters-to-my-SQL-statement/mp/118716

https://community.powerbi.com/t5/Power-Query/parameters-to-SP-or-Sql-query/mp/57734

http://biinsight.com/power-bi-desktop-query-parameters-part2-dynamic-data-masking-and-query-parameter….

O mira más de estas publicaciones aquí..

https://community.powerbi.com/t5/forums/searchpage/tab/message?advanced=false&allow_punctuation=fals…

si te sirve márcalo como solución

Felicitaciones también son agradables

gcam032

En respuesta a VasTg

Gracias, estos no cubren lo que necesito.

Quiero ejecutar una consulta SQL con diferentes cláusulas where (dinámicamente) en función de la presencia de datos en un parámetro. Me gustaría saber cómo hacer un if/then/else más complejo en caso de que tenga más de 2 variaciones de la cláusula where.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *