¿Cómo puedo usar VARIADIC para pasar una matriz de argumentos a la función FORMAT() dependiendo de una condición CASE en PostgreSQL 11?
Esto, por ejemplo, funciona:
SELECT FORMAT('Hi %s, I am %s', VARIADIC ARRAY['John', 'Paul']);hola juan soy pablo
Esto también funciona:
SELECT FORMAT('Hello %s, I am %s.', CASE WHEN 1 = 1 THEN 'John' ELSE 'Mary' END, CASE WHEN 1 = 1 THEN 'Paul' ELSE 'Elli' END);Hola Juan, soy Pablo.
Esto, sin embargo, no:
SELECT FORMAT('Hello %s, I am %s.', CASE WHEN 1 = 1 THEN VARIADIC ARRAY['John', 'Paul'] ELSE VARIADIC ARRAY['Mary', 'Elli'] END);ERROR: error de sintaxis en o cerca de "VARIADIC" LÍNEA 3: CUANDO 1 = 1 THEN VARIADIC ARRAY['John', 'Paul...
Teóricamente debería funcionar, y si lo hace me evitará repetir CASE tantas veces como parámetros tenga que pasar. No quiero rodear FORMAT con CASE porque mi cadena es enorme.
VARIADIC es un modificador para la entrada de matriz en funciones. format() pasa a usarlo. El manual:
Las funciones
concat,concat_wsyformatsonvariadic, por lo que es posible pasar los valores a concatenar o formatear como una matriz marcada con la palabra claveVARIADIC(consulte la Sección 38.5.5 ).
No ocurre lo mismo con una construcción CASE , que para empezar ni siquiera es una función . Todavía hay una solución simple:
SELECT format('Hello %s, I am %s.', VARIADIC -- here! CASE WHEN true THEN ARRAY['John', 'Paul'] ELSE ARRAY['Mary', 'Elli'] END); Acabas de colocar mal la palabra clave. VARIADIC es un modificador de entrada . No aplicable a la salida.
(Respuesta a la pregunta en el comentario).
No es posible pasar cadenas individuales y una matriz al mismo tiempo. Concatene todos los argumentos en una sola matriz antes de pasar al modo VARIADIC :
SELECT format E'Title: %s\nHi %s, I am %s.'::text, VARIADIC 'MyTitle'::text || ARRAY['John', 'Paul']);O coloque todo en una matriz para empezar, si tiene el control de los parámetros. Demostrando un literal de matriz esta vez:
SELECT format(E'Title: %s\nHi %s, I am %s.'::text, VARIADIC '{MyTitle, John, Paul}'::text[]);Relacionada: