2012-03-07 51 views
1

這個可能比我做得更簡單。我要查詢有這樣在Postgresql列中擴充日期範圍

(productNumber varchar, firstYearAvailable int, lastYearAvailable int, ...) 

的基本佈局例如

(12345, 2004, 2006, ...), 
(22293b, 2009, 2011, ...), 
(a7564n, 2007, 2010, ...), 
etc. 

此表是通過一系列複雜的連接查詢中與其他表的功能表。截至目前,該查詢是這樣的

SELECT field1, field2, productNumber, firstYearAvailable, lastYearAvailable, ... 
FROM ... 
JOIN ... 
WHERE ... 
etc. 

而不是返回年份範圍爲每個產品(第一年 - 最後一年),這將是對我更有用返回每年每一個條目產品(firstYear,firstYear + 1,...,lastYear)。例如,假設產品號是12345,該產品的範圍是2004-2006,那麼查詢應返回該產品和這兩列。

(12345,2004), 
(12345,2005), 
(12345,2006) 

有一個更詳細,使此查詢特別困難,跨越多個零件號的查詢搜索,並且每個部件號可能有不同的年份範圍。

有沒有人有任何提示如何解決這個問題?我愚弄了循環和連接,並通過條件動態生成SQL語句,但沒有一個是有效的。

希望我已經提供了足夠的信息,但如果我沒有,請問。

感謝

+0

加入帶有日曆 - 表? – wildplasser 2012-03-07 21:09:55

回答

5

功能generate_series(start int, stop int)是你的答案:

create temporary table product_years 
    (productNumber varchar, firstYearAvailable int, lastYearAvailable int); 

insert into product_years values 
    ('12345', 2004, 2006), 
    ('22293b', 2009, 2011), 
    ('a7564n', 2007, 2010); 

select 
    productNumber, 
    generate_series(firstYearAvailable,lastYearAvailable) as productYear 
    from product_years; 

 
productnumber | productyear 
---------------+------------- 
12345   |  2004 
12345   |  2005 
12345   |  2006 
22293b  |  2009 
22293b  |  2010 
22293b  |  2011 
a7564n  |  2007 
a7564n  |  2008 
a7564n  |  2009 
a7564n  |  2010 
(10 rows) 

+0

不可思議!似乎所有我的難題都可以通過簡單的函數調用來解決。非常感謝! – 2012-03-08 14:01:22