转换为 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;
当我尝试格式化 () 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;