Postgresql

有什麼方法可以在 PostgreSQL 中的字元串值內執行查詢?

  • February 18, 2022

我想使用具有動態數量的類別名稱的交叉表功能來透視表。通過探勘網路,我找到了解決方案。

解決方案 - http://www.rummandba.com/2013/03/postgresql-dynamic-crosstab-function.html

使用的功能

  DROP FUNCTION crosstab_dynamic_sql_gen_fn (source_sql text, category_sql 
  text, v_matrix_col_type varchar(100), v_matrix_rows_name_and_type 
  varchar(100),debug bool);
  CREATE OR REPLACE FUNCTION crosstab_dynamic_sql_gen_fn (source_sql text, 
  category_sql text, v_matrix_col_type varchar(100), 
  v_matrix_rows_name_and_type varchar(100),debug bool default false)
  RETURNS text AS $$
  DECLARE
  v_sql text;
  curs1 refcursor;
  v_val text;
  BEGIN
  v_sql = v_matrix_rows_name_and_type;
  OPEN curs1 FOR execute category_sql;
  Loop
  FETCH curs1 INTO v_val;
  exit when v_val IS NULL;
  v_sql = v_sql ||' , "'||v_val||'" '||v_matrix_col_type;
  IF debug THEN
  RAISE NOTICE 'v_val = %',v_val;
  END IF; 
  END LOOP;
  CLOSE curs1;
  v_sql := 'SELECT * from crosstab(' || chr(10) || E' \''||source_sql || 
  E'\','||chr(10) || E' \''||category_sql || E'\'' || chr(10)|| ' ) AS (' || v_sql ||')';
  IF debug THEN
  RAISE NOTICE 'v_sql = %',v_sql;
  END IF;
  RETURN v_sql;
  END;
  $$ language 'plpgsql';

用於獲取函式結果的查詢

select crosstab_dynamic_sql_gen_fn('select emp_id, month, qty from sales 
order by 1','select distinct month from sales','int','year text');

查詢的結果是字元串。有人可以告訴我如何在字元串中執行查詢。下面是查詢結果

在此處輸入圖像描述

您將其拉到客戶端,然後將其發送回伺服器。這使得這是一個非常糟糕的主意。即使您可以在字元串中動態生成返回列的類型(此處已證明),您也無法使用符合標準的 SQL 動態返回任何內容。

如果您使用 psql,則有一個命令可以自動執行該過程。在某些東西返回一個 sql 字元串後,您可以使用它執行它\gexec

正如他們在上面的來源中所說,

只要你得到生成的 sql,你就可以隨心所欲。您可以創建函式、視圖等。

所以你也可以做那種事情。也就是說,不返回動態列列表的東西,比如發出一個CREATE FUNCTION或一個CREATE SQL命令。

您可以將字元串(sql 查詢)儲存在變數中並執行 execute immediately variable_name.

https://www.postgresql.org/docs/current/ecpg-dynamic.html

引用自:https://dba.stackexchange.com/questions/192673