2012-06-05 56 views
5

因爲我不得不做任何數據庫工作已經有一段時間了,所以我不太清楚如何提出這個問題,而且我知道我過去做過。
如何從字符串列表中創建臨時表(不使用CREATE TEMPORARY TABLE)?所以,如果你有這樣的:PostgreSQL:如何搜索一個字符串列表作爲表?

  • '1', 'A', 'A'
    '2', 'B', 'B'
    '3', 'C' , 'C'

  • SELECT field2 
    FROM { {'1','a','A'}, {'2','b','B'}, {'3','c','C'} } 
         AS fooarray(field1,field2,field3) 
    WHERE field1 = '2' 
    -- should return 'b' 
    

提示:這是類似...

  • SELECT * FROM unnest(array[...]); 
    
+0

使用'unnest'有什麼問題? –

+0

對於1,多維數組並不適用。但是我們只是說我有一個一維數組,我仍然努力加入一個現有的表,從select(select * from unnest('{「A」,「B」,「C」 }')作爲字母)作爲foo,其中下(字母)不在(選擇lower(letter)from someothertable);' – vol7ron

+0

更新:所以我不知道加入問題是什麼,但它現在正在加入。多維度仍然是一個問題。我只想使用本地函數,並避免使用任何類型的存儲過程來解除維度。 - mu's'values'就是我正在尋找的東西,可能是我過去做的 – vol7ron

回答

10

你並不需要使用數組勾搭可言,你可以使用VALUES就地建表:

7.7。值列表

VALUES提供了一種生成「常量表」的方法,該查詢可以在查詢中使用,而無需實際創建和填充磁盤上的表。

另請參閱VALUES

所以你可以做這樣的事情:

=> select * 
    from (
     values ('1', 'a', 'A'), 
       ('2', 'b', 'B'), 
       ('3', 'c', 'C') 
    ) as t(id, c1, c2) 
    where id = '2'; 

id | c1 | c2 
----+----+---- 
2 | b | B 
(1 row) 

不要忘記給你的價值觀完整的列名(t(id, c1, c2)),使一切有名稱的別名。

+0

出於某種原因,我以爲我使用的是{{},{}}'語法,但後來我記得我使用的值是好。無論哪種方式,這都是我所需要的。你是否也應該在別名上指定數據類型(例如't(id :: numeric,c1 :: text,c2 :: text)')? – vol7ron

+0

@ vol7ron:AFAIK你必須在每個VALUES中指定數據類型,儘管你可能不需要它們,但這些類型應該被推斷得很好。 –