Postgresql格式函数的布尔值转换为jsonb

时间:2015-09-16 08:30:59

标签: postgresql jsonb

当我尝试格式化()一个postgresql布尔值并将值转换为jsonb对象时,PostgreSQL引发了一个异常:

# select format('%s', true)::jsonb;
ERROR:  invalid input syntax for type json
DETAIL:  Token "t" is invalid.
CONTEXT:  JSON data, line 1: t

我很确定格式化布尔值会给出t或f而不是完整的单词,这就是json所期望的那样。

通过使用case语句

已经有了解决方案
 select format('%s', case when true then 'true' else 'false' end)::jsonb;
 format 
--------
  true
(1 row)

然而,虽然这对于上面的微不足道的案例似乎很好,但是当它在函数中使用时,任何更复杂的东西看起来都很不合适。有没有更简洁的解决方案呢?

上下文是我有一个函数返回键映射到布尔标志的哈希值,这是由函数决定的。一个函数看起来像的样本是

return format( '{
        "is_valid" : %s,
        "is_authorized" : %s,
        "is_not_delegated" : %s,
        }',
        is_valid(function_argument),
        is_authorized(function_argument),
        not is_delegated(function_argument)
 )::jsonb;

2 个答案:

答案 0 :(得分:0)

select 
    row_to_json(q)
from (
    select 
        true is_valid,
        false is_authorized
) q

答案 1 :(得分:0)

您可以像 my_column::text 一样使用从布尔值到文本的强制转换

select format('{"level":%s,"cluster":%s}', rl.level, rl.cluster::text)