簡體   English   中英

如何在 plpgsql function 中包含報價

[英]How to include quote in plpgsql function

以下 function 標識具有 null 值的列。 如何擴展where子句以檢查 null 或空值?

coalesce(TRIM(string), '') = ''
CREATE OR REPLACE FUNCTION public.is_column_empty(IN table_name varchar, IN column_name varchar)
    RETURNS bool
    LANGUAGE plpgsql
AS $function$
declare 
    count integer;
    BEGIN
execute FORMAT('SELECT COUNT(*) from %s WHERE %s IS NOT NULL', table_name, quote_ident(column_name)) into count;
    RETURN (count = 0);
    END;
$function$
;

您需要將引號加倍,如下所示:

CREATE OR REPLACE FUNCTION public.is_column_empty(IN table_name varchar, IN column_name varchar)
    RETURNS bool
    LANGUAGE plpgsql
AS $function$
declare 
    count integer;
    BEGIN
execute FORMAT('SELECT COUNT(*) from %s WHERE COALESCE(TRIM(%s),'''') <> ''''', table_name, quote_ident(column_name)) into count;
    RETURN (count = 0);
    END;
$function$
;

編輯:

重新閱讀你的問題,我有點不確定你是否得到了你想要的。 就目前而言,如果至少一行在給定列中有值,則 function 將返回 false,即使所有其他行都是空的。 這真的是您想要的,還是您更願意尋找任何行中該列為空的列?

還有更多可能性 - 例如,您可以使用自定義字符串分隔符:

CREATE OR REPLACE FUNCTION public.is_column_empty(IN table_name varchar,
                                                  IN column_name varchar)
  RETURNS bool
LANGUAGE plpgsql
AS $function$
 DECLARE _found integer; /* attention "count" is keyword */
BEGIN
  EXECUTE format($_$SELECT EXISTS(SELECT FROM %I WHERE COALESCE(trim(%I), '') <> '')$_$, 
                 table_name, column_name)
    INTO _found;
  RETURN NOT _found;
END;
$function$;

您的示例有更多問題:

  • 不要在您真正需要知道行數(項目)的地方使用count 這在更大的桌子上可能會很慢
  • 通常對於關鍵字使用大寫字符
  • 不要使用 SQL、PL/pgSQL 關鍵字(保留或未保留)的變量名稱,在某些情況下( countuser 、...)可能會出現一些問題
  • 這是數據中一些混亂的典型示例 - 您應該禁止數據中的空字符串。 然后你可以使用索引和謂詞COLNAME IS NOT NULL 它可以非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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