Bir numaralandırmanın sahip olabileceği tüm değerleri almak için SQL sorgusu


Yanıtlar:


264

Bir dizi istiyorsanız:

SELECT enum_range(NULL::myenum)

Numaralandırmadaki her öğe için ayrı bir kayıt istiyorsanız:

SELECT unnest(enum_range(NULL::myenum))  

ek bilgi

Numaralandırma varsayılan şemada olmasa bile bu çözüm beklendiği gibi çalışır. Örneğin, yerine myenumile myschema.myenum.

Yukarıdaki sorguda döndürülen kayıtların veri türü olacaktır myenum. Ne yaptığınıza bağlı olarak metne yayın yapmanız gerekebilir. Örneğin

SELECT unnest(enum_range(NULL::myenum))::text

Sütun adını belirtmek isterseniz, ekleyebilirsiniz AS my_col_name.


Cevabıma dahil ettiğim bazı ek ipuçlarına dikkat çektiği için Justin Ohms'a teşekkür ederiz.


1
Bu cevap çok daha özlü. Güzel katkı!
Darin Peterson

3
Gerçek olmayan çağrı, "myenum" sütun adıyla myenum türündeki kayıtları döndürür. Ayrıca numaralandırmayı metne dökmek ve benzer bir şey ekleyerek bir sütun adı belirtmek isteyebilirsiniz. :: metin AS my_column
Justin Ohms

1
Numaralandırma işlevleri hakkında daha fazla bilgi edinmek için bu bağlantıyı görüntüleyebilirsiniz postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet

1
anlamı ne NULL::?
Sung Cho

1
@ChrisL teşekkürler. çok garip görünüyor. neden yapamıyoruz SELECT enum_range(myenum)? Dökümün anlamı nedir null?
Sung Cho

31

Deneyin:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'

1
Birden fazla şemada aynı numaralandırmaya sahipseniz, bunun biraz daraltılması gerekebilir. Bu durumda, ayrıntılar için postgresql.org/docs/current/static/catalog-pg-type.html adresine bakın.
Kev

1
Sanırım 'myenum' u alt çizgi ile işaretlemeniz gerekiyor. Enum değerleri almanız gerekiyorsa ve enum adı birden fazla şemada kullanılabiliyorsa cevabımı kontrol edin.
David Underhill

Numaralandırma sırası önemliyse, ORDER BY e.enumsortordersorguyu ekleyin . Numaralandırma türüne BEFOREveya değerleri kullanılarak yeni değerler eklenirse, numaralandırılmış değerler büyük olasılıkla bozuk olacaktır AFTER.
Clint Pachl

5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

Bu, "your_enum" numaralandırma içeriğinin tek bir sütun sonuç kümesi türünde "your_column" adlı bir sütunla döner.


4

Aşağıdaki sorguyu kullanarak bir numaralandırma için tüm numaralandırma değerlerini alabilirsiniz. Sorgu, numaralandırmanın hangi ad alanında da yaşadığını seçmenize izin verir (numaralandırma birden çok ad alanında tanımlanırsa gereklidir; aksi takdirde sorgunun bu bölümünü atlayabilirsiniz).

SELECT enumlabel
FROM pg_enum
WHERE enumtypid=(SELECT typelem
                 FROM pg_type
                 WHERE typname='_myenum' AND
                 typnamespace=(SELECT oid
                               FROM pg_namespace
                               WHERE nspname='myschema'))

1
Dizi türü olduğunu mu söylüyorsunuz? Bu benim için çalışıyor (PostgreSQL 9.0).
David Underhill

+1 DB için şemaların kullanılması nedeniyle @ Kev'nın cevabı işe yaramazken benim için çalıştı.
user9645
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.