簡體   English   中英

如何在plpgsql中引用架構變量

[英]how to reference a schema variable in plpgsql

我正在嘗試學習plpgsql代碼以自動執行數據庫中的某些數據清理。

我當前的任務是將數字字段中的所有“ 999”值替換為“ NaN”。 我正在嘗試做的是:1)找到數字模式中的所有列2)遍歷這些列並使用“更新/替換”

我的代碼如下。 我認為我的主要問題是找出如何在update語句中引用schema.table(但我確信還有其他事情我做得還不夠好)。

我得到的錯誤是該關系未被識別。 任何援助將不勝感激

貝基

CREATE OR REPLACE FUNCTION household.nodata_replace(schemanm text)
RETURNS VOID as $$
DECLARE
  cname text;
  tname text;
BEGIN
   --FOR col IN
  for cname,tname in SELECT column_name::text,table_name::text FROM information_schema.columns
     where table_schema = schemanm and data_type in ('integer','double precision')

     LOOP

     RAISE NOTICE 'cname is: % from %', cname, tname;
     EXECUTE 'update '||schemanm::regclass||'.' ||tname::regclass||
 ' set ' || quote_ident(cname) ||' = replace('  || quote_ident(cname) ||', 999, NaN);';
     END LOOP;


END;
$$
LANGUAGE plpgsql;

我寧願為此使用format() 占位符%I需要時會正確引用標識符。

replace()用於字符串操作,而不用於替換數字。 要分配值NaN,請使用set xxx = 'NaN' 但是您不能對integer數值執行此操作。 整數不支持NaN

因此,您的動態SQL歸結為:

execute format('update %I.%I set %I = ''NaN'' where %I = 999, schemanm, tname, cname, cname);

但是您將需要更改where子句以不包括integer列。 您可能還希望包括numericreal

and data_type in ('numeric','double precision', 'real')

如果您只想標記“缺少信息”,我寧願在這些列中存儲null 在這種情況下,您無需區分不同的數據類型:

execute format('update %I.%I set %I = null where %I = 999, schemanm, tname, cname, cname);

嘗試重新整理您的查詢,如下所示:

EXECUTE 'update '|| (schemanm||'.'||tname)::regclass ||' set ' || quote_ident(cname) ||' = ''NaN'' WHERE '|| quote_ident(cname) ||' = 999;'

因為強制轉換為regclass試圖在已注冊的關系中進行搜索。 與架構無關。

或者你可以

EXECUTE 'update '|| quote_ident(schemanm)||'.'||quote_ident(tname) ||' set ' || quote_ident(cname) ||' = ''NaN'' WHERE '|| quote_ident(cname) ||' = 999;'

暫無
暫無

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

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