如何将 CASE 构造与 VARIADIC 关键字集成为 format() 的输入

How to integrate a CASE construct with the VARIADIC keyword as input to format()

如何根据 PostgreSQL 11 中的 CASE 条件使用 VARIADIC 将参数数组传递给 FORMAT() 函数?

例如,这个有效:

SELECT FORMAT('Hi %s, I am %s', VARIADIC ARRAY['John', 'Paul']);

Hi John, I am Paul

这也有效:

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);

Hello John, I am Paul.

然而,这不是:

SELECT FORMAT('Hello %s, I am %s.',
              CASE
                WHEN 1 = 1 THEN VARIADIC ARRAY['John', 'Paul']
                ELSE VARIADIC ARRAY['Mary', 'Elli']
              END);

ERROR: syntax error at or near "VARIADIC" LINE 3: WHEN 1 = 1 THEN VARIADIC ARRAY['John', 'Paul...

理论上它应该可以工作,如果它可以工作,我将不必重复 CASE 次我必须传递的参数。我不想用 CASE 包围 FORMAT 因为我的字符串很大。

VARIADIC 是数组输入函数的修饰符。 format()正好用到了。 The manual:

The concat, concat_ws and format functions are variadic, so it is possible to pass the values to be concatenated or formatted as an array marked with the VARIADIC keyword (see Section 38.5.5).

CASE 结构并非如此,它甚至不是一个 函数 开始。还有一个简单的解决办法:

SELECT format('Hello %s, I am %s.', VARIADIC  -- here!
              CASE
                WHEN true THEN ARRAY['John', 'Paul']
                ELSE ARRAY['Mary', 'Elli']
              END);

您刚刚放错了关键字。 VARIADIC 是一个 input 修饰符。不适用于输出。

合并数组和非数组参数?

(在评论中回答问题。)
不可能同时将单个字符串 传递给一个数组。在传入 VARIADIC 模式之前将所有参数连接到一个数组:

SELECT format E'Title: %s\nHi %s, I am %s.'::text, VARIADIC
'MyTitle'::text || ARRAY['John', 'Paul']);

或者如果您可以控制参数,则首先将所有内容放入一个数组中。这次演示数组字面量:

SELECT format(E'Title: %s\nHi %s, I am %s.'::text,  VARIADIC '{MyTitle, John, Paul}'::text[]);

相关:

  • Pass array literal to PostgreSQL function
  • Return rows matching elements of input array in plpgsql function