2011-09-09 18 views
9

I bir fonksiyonun bir değişken olarak, bu tür bir dizi kullanabilirDiziler içeren bir bileşik tür dizisi nasıl oluşturulur?

CREATE TYPE example AS (id integer, some_stuff integer[]); 

Düşünce gibi bir bileşik türü vardır. Tek sorun bunun için bir dizi değişmezi inşa etmek için bir yol bulamadı olduğunu ben PostgreSQL'den onu elde denerseniz ...:

WITH elements AS (
    SELECT (12, '{1,2}')::example AS e UNION 
    SELECT (3, '{3,1}')::example 
) 
SELECT array_agg(e) FROM elements; 

aşağıdaki olsun:

{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 

Ama bak :

SELECT E'{"(3,\"{3,1}\")","(12,\"{1,2}\")"}'::example[]; 

ERROR: malformed array literal: "{"(3,"{3,1}")","(12,"{1,2}")"}" 
LINE 1: select E'{"(3,\"{3,1}\")","(12,\"{1,2}\")"}'::example[] 

Bunu yapmanın bir yolu var mı?

cevap

11

deneyin kullanılarak ARRAY ve ROW kurucular:

Select array[row(3, array[3,1]), row(12, array[1,2])]::example[]; 
       array 
------------------------------------ 
{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 
(1 row) 

Eğer Kurucular kullanmadan çözüm istiyorlarsa, o zaman şu örneği kullanın:

Select E'{"(3,\\"{3,1}\\")","(12,\\"{1,2}\\")"}'::example[]; 
       example 
------------------------------------ 
{"(3,\"{3,1}\")","(12,\"{1,2}\")"} 
(1 row) 

Burada ana sorunu Gördüğünüz gibi yazmanız gereken olmasıdır \\", çünkü bu, ilk seçiminizin çıktısı olarak gördüğünüz \" ("escape" string sözdizimini kullanarak) anlamına gelir.

+0

Teşekkürler! Tek sorun, burada literalleri kullanmam gerektiğidir, dizi yapıcısı bir seçenek değildir. Neyse ki bu nadir bir durumdur :) – dezso

+0

@dezso: Gördüğüm cevaplarımı kontrol et. –

+0

Harika! çok teşekkürler. – dezso