![](/img/trans.png)
[英]Aggregate column from CTE cannot be used in WHERE clause in the query in PostgreSQL
[英]postgresql/psql query where clause multiple “or” read from file
抱歉,之前是否有人問過類似的問題(我進行了搜索,但找不到任何有用的信息)。
我有一張桌子,上面有數據傳輸的詳細信息。 字段之一是與傳輸關聯的IP。 我需要開發一個查詢,該查詢將使我獲得表中與79個IP之一匹配的記錄的子集(表中有608個不同的IP)。 我有一個文件,其中的必需IP由換行符分隔。 有沒有一種方法可以開發一個查詢來讀取此IP文件以獲得所需的記錄,而不是由我手動輸入每個用“或”分隔的IP?
如果數據庫或客戶端中的IP文本用換行符分隔,則此查詢將完成此任務:
將列表轉換為數組,取消嵌套並加入主表:
SELECT *
FROM (SELECT unnest(string_to_array(your_list_of_ips, E'\n')) AS ip) sub
JOIN data_transfers d USING (ip);
有關使用的功能的更多信息,請參見此處的手冊。
COPY
要直接從文件導入,可以使用COPY
。 數據文件必須與Postgres在同一台計算機上,並且您需要為此數據庫超級用戶。
這次我們已經每行有一個IP:
CREATE TEMP TABLE tmp(ip text);
COPY tmp FROM '/path/to/file';
SELECT *
FROM tmp
JOIN data_transfers d USING (ip);
\\copy
如果您的文件位於另一台計算機上,或者您沒有超級用戶特權,請改用(主要是)等效的\\copy
sql pcopy。 要從bash中進行操作(如評論中的要求):
psql dbname
dbname=# \set ips `cat ips.txt`
dbname=# SELECT *
dbname-# FROM (SELECT unnest(string_to_array(:'ips', E'\n')) AS ip) sub
dbname-# JOIN data_transfers d USING (ip);
\\set
是psql元命令,用於設置變量-在這種情況下為文件的內容。
ips.txt
是您的IP地址文件。
:'ips'
是單引號SQL插值的語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.