2017-11-26 7 views
0

stageというスキーマ内のさまざまなテーブルにあるすべての顧客名をクリーンアップするツールを実装しています。顧客名は列billing_acc_nameまたはcust_acc_namesから来る可能性があります。私は事前にどのくらいのテーブルがこれらの列を持っているかはわかりませんが、そうである限り、それらはクリーンアップの一部になります。Postgres PL/pgSQLさまざまなテーブルに存在するカラムを統合する

ただし、クリーンアップする前に、スキーマ内のテーブル全体で一意の顧客名をすべて選択する必要があります。

私はPL/pgSQLでこれを実装することを検討しています。現在、これは自動生成されたSQLクエリ文字列私はこのPythonで/パンダ/ SQLAlchemyのなどを実装していますか

table_name = 'information_schema.columns' 
table_schema_src = 'stage' 
cols = ['billing_acc_name', 'cust_acc_name'] 

# get list of all table names and column names to query in stage schema 
sql = text(f""" 
    SELECT table_name, column_name FROM {table_name} WHERE table_schema ='{table_schema_src}' 
    AND column_name = ANY(ARRAY{cols}) 
""") 
src = pd.read_sql(sql, con=engine) 

# explore implementation in pgsql 
# establish query string 
cnames = [] 
for i, row in src.iterrows(): 
    s = text(f""" 
     SELECT DISTINCT upper({row['column_name']}) AS cname FROM stage.{row['table_name']} 
    """) 
    cnames.append(str(s).strip()) 

sql = ' UNION '.join(cnames) 

df = pd.read_sql(sql, con=engine) 

で以下のようにします:

SELECT DISTINCT upper(cust_acc_name) AS cname FROM stage.journal_2017_companyA UNION 
SELECT DISTINCT upper(billing_acc_name) AS cname FROM stage.journal_2017_companyA UNION 
SELECT DISTINCT upper(cust_acc_name) AS cname FROM stage.journal_2017_companyB UNION 
SELECT DISTINCT upper(billing_acc_name) AS cname FROM stage.journal_2017_companyB UNION 
SELECT DISTINCT upper(cust_acc_name) AS cname FROM stage.journal_2017_companyC UNION 
SELECT DISTINCT upper(billing_acc_name) AS cname FROM stage.journal_2017_companyC UNION 
SELECT DISTINCT upper(cust_acc_name) AS cname FROM stage.journal_2017_companyD UNION 
SELECT DISTINCT upper(billing_acc_name) AS cname FROM stage.journal_2017_companyD 

答えて

1

plpgsqlが機能がどのように見えることがありこの:

create or replace function select_acc_names(_schema text) 
returns setof text language plpgsql as $$ 
declare 
    rec record; 
begin 
    for rec in 
     select table_name, column_name 
     from information_schema.columns 
     where table_schema = _schema 
     and column_name = any(array['cust_acc_name', 'billing_acc_name']) 
    loop 
     return query 
     execute format ($fmt$ 
      select upper(%I) as cname 
      from %I.%I 
      $fmt$, rec.column_name, _schema, rec.table_name); 
    end loop; 
end $$; 

用途:

select * 
from select_acc_names('stage'); 
+0

はテストされ、素晴らしい仕事をしました。あまりにも素晴らしい。 – idazuwaika

関連する問題