2014-06-27 19 views
7

Bir tablo döndüren bir işlev var. Eğer SELECT * FROM some_function(12345) çalıştırırsanız"Yoğunlaştırılmış" PostgreSQL satırını ayrı sütunlara nasıl genişletebilirsiniz?

sonucudur:

object_id | name 
---------------- 
    12345 | "B" 

Eğer sonucudur SELECT some_function(12345) çalıştırırsanız:

some_function 
------------- 
(12345,"B") 

Sorun bireysel erişebilmesi için ben (orijinal formu istememizdir sütun değerleri), ancak some_function() argümanını bir tablodaki bir sütundan gel. Ben SELECT some_function(thing_id) FROM things yürütebileceği ancak bu döndürür:

some_function 
------------- 
(12345,"B") 
(12346,"C") 
(12347,"D") 

ne döndü istiyorum Oysa:

object_id | name 
---------------- 
    12345 | "B" 
    12346 | "C" 
    12347 | "D" 

Peki nasıl bir "içi çelikten kurtar" veya böyle bir yoğunlaştırılmış satır "genişletmek" olabilir?

PostgreSQL 9.3 veya daha yeni kullanım örtülü bir yan sorguyu

cevap

15

:

SELECT f.* FROM things t, some_function(t.thing_id) f; 

Önceki versiyonları, some_function çoklu-değerlendirme neden olur:

SELECT (some_function(thing_id)).* FROM things; 
+0

'f. *' Nereden geliyor? Yanal bir katılımın örtük olabileceğini bilmiyordum. Bence bu iyi bir şey değil ve hatta bundan bahsedilmemelidir :) Sadece emin olmak için: 9.3 'select (f())' in çoklu değerlendirmesini yapmaz. –

+0

@ClodoaldoNeto Sabit eksik takma ad. Birden fazla değerlendirmeye gelince ... 9.3 *, * (f()). ''. Yanal sorgular yok. –

+1

"LATERAL" ifadesi örtük olduğu için - her bir teknik özelliktir. '' LATERAL '' anahtar sözcüğü sadece gürültüsüzdür - bu da bir fonksiyonun gelebileceği herhangi bir parametre olmadığı için makul görünüyor. Sanırım satır içi dokümanlar olarak gösterilmeye değer, ancak insanlar o olmadan benzer bir sorgu gördüklerinde kafası karışıyor. –

-1
SELECT * FROM (SELECT some_function(thing_id) FROM things) x; 

her biri için bir satır döndürür SELECT some_function(thing_id) FROM things alt seçim kayıt bulundu. Dış seçim, satırı ayrı sütunlara "açar".

+0

'' – magnus

+0

adresinden veya bu noktadan kaynaklanan sözdizimi hatası lütfen OP'nize ve Diğer kullanıcı daha iyi anlayabilmeniz için cevabınıza biraz açıklama ekleyin –