首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将CASE构造与VARIADIC关键字集成为format()的输入

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

Stack Overflow用户
提问于 2021-11-09 16:59:47
回答 1查看 55关注 0票数 2

如何使用VARIADIC将参数数组传递给FORMAT()函数,具体取决于PostgreSQL 11中的CASE条件?

例如,这样做是可行的:

代码语言:javascript
复制
SELECT FORMAT('Hi %s, I am %s', VARIADIC ARRAY['John', 'Paul']);

嗨,约翰,我是保罗

这也适用于:

代码语言:javascript
复制
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);

你好,约翰,我是保罗。

然而,这并不是:

代码语言:javascript
复制
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,因为我的字符串很大。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-09 17:46:44

VARIADIC是将数组输入到函数中的修饰符。format()碰巧使用了它。手册:

concatconcat_wsformat函数是variadic,因此可以将要连接或格式化的值传递为标记为VARIADIC关键字的数组(参见第38.5.5款)。

对于一个CASE构造来说,情况并非如此,它甚至不是一个函数。仍然有一个简单的解决方案:

代码语言:javascript
复制
SELECT format('Hello %s, I am %s.', VARIADIC  -- here!
              CASE
                WHEN true THEN ARRAY['John', 'Paul']
                ELSE ARRAY['Mary', 'Elli']
              END);

你只是把关键词放错了地方。VARIADIC是一个输入修饰符。不适用于输出。

组合数组和非数组参数?

(请回答评论中的问题。)

不可能同时传递单个字符串和数组。在传入VARIADIC模式之前,将所有参数串联到单个数组:

代码语言:javascript
复制
SELECT format E'Title: %s\nHi %s, I am %s.'::text, VARIADIC
'MyTitle'::text || ARRAY['John', 'Paul']);

或者首先将所有内容放入数组中,如果您控制参数的话。这次演示数组文字:

代码语言:javascript
复制
SELECT format(E'Title: %s\nHi %s, I am %s.'::text,  VARIADIC '{MyTitle, John, Paul}'::text[]);

相关信息:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69902143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档