2015-01-31 155 views
0

假設這個非常簡單的SQL查詢:重複一個SQL查詢

SELECT * FROM a WHERE time < '2010-01-01' 

現在,我怎麼能組合查詢,其中在部分時間實際上是一個「數組」?

不知何故的線之間:

SELECT * FROM a WHERE time < ['2010-01-01', '2012-01-01'] 

的選擇應執行兩次而是導致一個結果集。

注意,該樣品陣列只包含兩個項目,但它可能包含更多的人,因爲結果實際上是從一個子查詢的到來。

PostgreSQL的9.3

+3

請出示基礎上,一些樣本數據和預期輸出(編輯你的問題) – 2015-01-31 19:15:29

+0

的實際查詢要複雜得多,涉及GROUP BY,隨着時間的推移計數的項目,所以我很感興趣的一個計算運行一段時間。 – JohnDoe 2015-01-31 21:42:41

+1

@JohnDoe:你正在尋求解決方案的選擇路徑的細節,但我懷疑它是最好的方法。提出*問題*,而不是解決方案的碎片。用表格定義,樣本數據和預期結果進行備份。確切的數據類型在這裏至關重要。 – 2015-02-01 03:32:48

回答

1

ANY作品對於這一點,如:

SELECT * FROM a WHERE time < ANY (SELECT '2010-01-01' UNION ALL SELECT '2012-01-01') 
+0

我看不錯:選擇ID 從(值(1),(2),(3))爲t(ID) 其中id <=任何(陣列[1,2]) – JohnDoe 2015-02-09 22:46:12

0

也許你給一個壞的樣本SQL因爲SELECT * FROM a WHERE time < '2012-01-01'會給你所有的日期包括'2010-01-01'

如果你只是想要兩個相同結構reultsets合併成一個,然後UNION運營商將幫助您的位置:

SELECT * FROM a WHERE time < '2010-01-01' 
UNION 
SELECT * FROM a WHERE time < '2012-01-01' 

如果你想包括< '2010-01-01'來自查詢你需要使用結果

+0

沒錯,但問題是我不知道有多少項目會在這個數組中,結果從另一個選擇來了,所以聯盟將無法正常工作。 – JohnDoe 2015-01-31 21:34:08

0

這應該做的伎倆 - 用ANY爲:

select * 
from a 
where time < any(array['2010-01-01'::timestamp, '2012-01-01'::timestamp]) 
0

如果說時間就是從子查詢來了,你可以包括該子查詢轉化爲Non Equi加入(<):

SELECT DISTINCT A.* 
FROM Table_1 AS A 
INNER JOIN (SELECT DISTINCT Time FROM DATE_Array_Table) AS B 
     on (A.Time < B.Time) 

有上INNER JOIN表的日期的陣列,在這種情況下,當然你會得到重複,但只能查詢表格中的不同值將解決,很容易。

在這種情況下,它並不重要,你有多少時間值有(1,2,3,4,...)。你已經寫道你的最終查詢是聚合,所以要注意我的解決方案中的重複。