2012-11-08 25 views
13

thể trùng lặp:
Postgres Dynamic Query FunctionPostgreSQL - giá trị động như tên bảng

Tôi muốn sử dụng chuỗi trở về từ truy vấn dưới đây như là một tên bảng cho truy vấn khác.

SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd') 

như bạn có thể thấy nó trả về một chuỗi. Tôi muốn sử dụng nó làm đầu vào cho một truy vấn khác, ví dụ:

CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')) 
AS * SELECT FROM backup 

Có thể làm được không? Bất kỳ đầu mối như thế nào?

+0

Tôi có giải pháp không áp dụng http://stackoverflow.com/questions/10639963/postgres-dynamic-query-function nhưng thú vị cho vấn đề này: SELECT '"backup_' || TO_CHAR (CURRENT_DATE, 'yyyy-mm -dd ') ||' "'AS tname; \ gset TẠO BẢNG: tname AS SELECT * FROM backup; –

Trả lời

27

Bạn cần sử dụng PL/PgSQL EXECUTE statement, thông qua một khối DO hoặc chức năng PL/PgSQL (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql). SQL động không được hỗ trợ trong phương ngữ SQL thông thường được PostgreSQL sử dụng, chỉ trong phiên bản PL/PgSQL thủ tục.

DO 
$$ 
BEGIN 
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd')); 
END; 
$$ LANGUAGE plpgsql; 

Các format(...) function 's %I%L định dạng specifiers làm định đúng đắn và đen trích dẫn, tương ứng.

Đối literals Tôi khuyên bạn nên sử dụng EXECUTE ... USING hơn format(...) với %L, nhưng đối với định danh như bảng/tên cột mô hình định dạng %I là một thay thế ngắn gọn đẹp là Verbose quote_ident cuộc gọi.

+1

Tên sẽ tự động được trích dẫn nếu nó có chứa các ký tự đặc biệt không? Tôi không thực sự là một người dùng PostgreSQL, nhưng có vẻ nghi ngờ rằng một hàm FORMAT() đơn giản sẽ đủ thông minh để làm điều đó. –

+2

@AndriyM Trình giữ chỗ nội suy '% I' trong hàm [' format() '] (http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER) là cụ thể cho số nhận dạng bưu điện và sẽ báo giá một cách an toàn giá trị được cung cấp. – dbenhur

+0

@dbenhur: Ồ, tốt, cảm ơn. Giải pháp tốt đẹp sau đó, Craig! (rõ ràng :) –

Các vấn đề liên quan