簡體   English   中英

Postgres 截斷 CASE 語句列

[英]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_nametext將解決問題:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM