如何使用VARIADIC将参数数组传递给FORMAT()函数,具体取决于PostgreSQL 11中的CASE条件?
例如,这样做是可行的:
SELECT FORMAT('Hi %s, I am %s', VARIADIC ARRAY['John', '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);你好,约翰,我是保罗。
然而,这并不是:
SELECT FORMAT('Hello %s, I am %s.',
              CASE
                WHEN 1 = 1 THEN VARIADIC ARRAY['John', 'Paul']
                ELSE VARIADIC ARRAY['Mary', 'Elli']
              END);错误:语法错误在或接近" VARIADIC“第3行:当1=1时,VARIADIC数组[‘John’,‘Paul.
从理论上讲,它应该可以工作,如果可以的话,它可以避免重复CASE的次数,就像我必须传递的参数数一样多。我不想用FORMAT包围CASE,因为我的字符串很大。
发布于 2021-11-09 17:46:44
VARIADIC是将数组输入到函数中的修饰符。format()碰巧使用了它。手册:
concat、concat_ws和format函数是variadic,因此可以将要连接或格式化的值传递为标记为VARIADIC关键字的数组(参见第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是一个输入修饰符。不适用于输出。
组合数组和非数组参数?
(请回答评论中的问题。)
不可能同时传递单个字符串和数组。在传入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[]);相关信息:
https://stackoverflow.com/questions/69902143
复制相似问题