![](/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.