如何将 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
如何根据 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
andformat
functions arevariadic
, so it is possible to pass the values to be concatenated or formatted as an array marked with theVARIADIC
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