2015-05-05 75 views
1

這可能嗎?基本上,我們將使用腳本從數據庫中提取信息。我們試圖設計一個查詢,它可以使用WHERE子句中的文本文件中的值列表來限制特定的記錄。此列表會定期更改,定期手動編輯查詢效率不高。我查看了SQL Server的this question,我想在PostgreSQL中做類似的事情。在postgreSQL查詢的where子句中使用文本文件

因此,舉例來說,一個超級簡單的查詢可能是這樣的

SELECT * 
FROM users 
WHERE userID in "C:\myfile.txt"; 
+3

不,這是不可能的。您需要先將文件導入(臨時)表中。另一種方法是定義一個外部數據包裝器,它允許您以文件的形式訪問該文件(但該文件需要在運行Postgres的**服務器**上) –

回答

1

你一定能做到這一點本身。如果要走這條路線,我會在查詢中使用Postgres COPY函數以及臨時表,並在完成時放棄臨時表。如果我沒有弄錯,這將要求您的文件存在於Postgres可以控制的文件夾內,例如您的數據文件夾,無論您安裝了Postgres。

但是,爲了一個更清潔的外觀,我寧願僱用PL/R這樣的東西。您可以快速從文件中讀取數據,並返回要在您的查詢中使用的值數組。我相信你可以用PL/PYTHON或其他任何你喜歡的方法來替代PL/R來訪問外部文件。

CREATE FUNCTION file_vals() 
    RETURNS integer[] AS 
    $BODY$ 
    return (readLines('C:/path/to/your/file.txt')) 
    $BODY$ 
    LANGUAGE plr IMMUTABLE; 

你file.txt的樣子:

555 
123 
567 

然後從你的函數調用(我把樣本數據中的子查詢來簡化):

WITH users AS(
    SELECT 123 AS userID 
) 
SELECT userID 
FROM users 
WHERE userID = ANY(file_vals()) 

編輯:DanielVérité指出在評論中,重要的是要注意,這隻有在您對數據庫擁有管理員權限時纔有效。 PL/R和任何其他允許外部文件訪問的語言擴展本身就是一種不可信的語言,這意味着只有管理員才能使用這些語言創建功能。

重要的是要注意,您正在閱讀的文件必須可以直接從Postgres服務器訪問。如果您通過遠程客戶端執行這些查詢,則需要先將該文件傳送到服務器。

+0

您必須是超級用戶才能執行此操作。由於您提到[plpython](http://www.postgresql.org/docs/current/static/plpython.html),請查看底部的細小打印:_PL/Python僅作爲「不可信」語言提供。 。只有超級用戶可以用不可信的語言(如plpythonu)創建函數._沒有可以在文件系統上運行的可信語言。 –

+1

@DanielVérité同意。 PL/R是一樣的。 OP沒有指定任何安全要求,所以我沒有考慮到我的答案。 – Shawn

+0

我同意Shawn在這裏。但我也認爲應該在答案中加上丹尼爾提供的信息。無論如何+1,很好的答案。 –