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

Postgresql format function of boolean values cast to 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;
select 
    row_to_json(q)
from (
    select 
        true is_valid,
        false is_authorized
) q

您可以使用从布尔值到文本的转换,例如 my_column::text

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

你可以这样使用:

select format('%s', true::text)::jsonb;