![](/img/trans.png)
[英]Update column within CASE statement with results of a subquery postgres
[英]Postgres truncates CASE statement column
我正在编写一些用于映射 Postgres 数据库的函数。 这些函数用于为 javascript API 创建动态查询。
我遇到了一个截断列的 output 的特定查询,我无法确定原因。
以下查询中的列宽似乎被截断为 63 个字符:
SELECT
CASE
WHEN t.column_name ~ '_[uid]*$' AND t.has_fn THEN
format(
'format(''%s/%%s'', %s) AS %s',
array_to_string(ARRAY['',t.fk_schema,t.fk_name],'/'),
t.column_name,
regexp_replace(t.column_name, '_[uid]*$', '_link')
)
ELSE t.column_name
END AS column
FROM core.map_type() t; -- core.map_type() is a set returning function
此查询用于为另一个查询创建 select 列表,但format()
生成的字符串被截断为 63 个字符。
但是,如果我添加|| ''
|| ''
到CASE
语句的ELSE
分支,问题就消失了:
SELECT
CASE
WHEN t.column_name ~ '_[uid]*$' AND t.has_fn THEN
format(
'format(''%s/%%s'', %s) AS %s',
array_to_string(ARRAY['',t.fk_schema,t.fk_name],'/'),
t.column_name,
regexp_replace(t.column_name, '_[uid]*$', '_link')
)
ELSE t.column_name || '' -- add empty string here
END AS column
FROM core.map_type() t; -- core.map_type() is a set returning function
像这样截断一列是一个令人担忧的问题。 这里的修复完全是 hack,感觉不像是真正的解决方案。
为什么会这样? 如何修复?
在这种情况下, CASE
语句的ELSE
分支中的t.column_name
的值是name
类型。 name
是 Postgres 内部用于命名事物的类型。 它具有 64 字节的固定长度。
该列被截断以适应ELSE
分支的长度。
将t.column_name
为text
将解决问题:
SELECT
CASE
WHEN t.column_name ~ '_[uid]*$' AND t.has_fn THEN
format(
'format(''%s/%%s'', %s) AS %s',
array_to_string(ARRAY['',t.fk_schema,t.fk_name],'/'),
t.column_name,
regexp_replace(t.column_name, '_[uid]*$', '_link')
)
ELSE t.column_name::text
END AS column
FROM core.map_type() t;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.