Skip to main content

PostgreSQL’de Array Veri Tipi ve Örnekleri

Merhaba,

Array veri tipi bir yada daha çok boyutlu olabilir. Bir alana aynı veri tipinde birden fazla değer girilmesini sağlar diyebiliriz.

Bir array’in hangi veritipine ait verileri barındıracağını belirleyebiliriz. Örneğin text veri tipinde bir array kullanabiliriz.

Basit bir array örneği yapalım. Aşağıdaki örnekte tek bir satır ve sütun göreceksiniz. Array içinde kullanılan her iki değer text veri tipinde.

[gunce] # SELECT array['aa','bb'];
 array  
---------
{aa,bb}
(1 row)

Bu ARRAY henüz bir tablonun sütunu olmadığı için deneme yapalım ve yukarıdaki array içine bir alan daha ekleyelim text veri tipinde olmayan. Böyle bir durumda hata verecektir çünkü ilk değer ne ise onunla aynı veri tipine sahip bir değer görmek isteyecektir.

[gunce] # SELECT array['aa','bb', 11];
ERROR:  22P02: invalid input syntax for integer: "aa"

Ürünlerin içeriklerini saklayan bir tablomuz olsun.


[gunce] # CREATE TABLE urunler(isim text, kategori text[]);
CREATE TABLE

Oluşturduğumuz tablomuza verilerimizi ekleyelim.

INSERT INTO urunler VALUES('iphone 8plus', ARRAY['elektronik', 'telefon', 'iphone']);
INSERT INTO urunler VALUES('iphone X', ARRAY['elektronik', 'telefon', 'iphone']);
INSERT INTO urunler VALUES('samsung galaxy S10', ARRAY['elektronik', 'telefon', 'samsung']);
INSERT INTO urunler VALUES('samsung galaxy S9', ARRAY['elektronik', 'telefon', 'samsung']);
INSERT INTO urunler VALUES('samsung n8808', ARRAY['elektronik', 'televizyon', 'samsung']);
INSERT INTO urunler VALUES('samsung nu8808', ARRAY['elektronik', 'televizyon', 'samsung']);
INSERT INTO urunler VALUES('canon pixima e3140', ARRAY['elektronik', 'yazıcı', 'canon']);
INSERT INTO urunler VALUES('nikon af-s 50mm f/1.8 g lens', ARRAY['elektronik', 'lens', 'nikon']);


-- Aşağıdaki gibi de INSERT yapabiliriz.
INSERT INTO urunler VALUES('pes 2019 ps4 oyun', '{"elektronik", "playstation oyunları", "ps4"}');

Tablomuzdaki verileri inceleyelim.

[gunce] # SELECT * FROM urunler;
            isim             |                kategori               
------------------------------+-----------------------------------------
iphone 8plus                 | {elektronik,telefon}
iphone X                     | {elektronik,telefon,iphone}
samsung galaxy S10           | {elektronik,telefon,samsung}
samsung galaxy S9            | {elektronik,telefon,samsung}
samsung n8808                | {elektronik,televizyon,samsung}
samsung nu8808               | {elektronik,televizyon,samsung}
canon pixima e3140           | {elektronik,yazıcı,canon}
nikon af-s 50mm f/1.8 g lens | {elektronik,lens,nikon}
pes 2019 ps4 oyun            | {elektronik,"playstation oyunları",ps4}
(9 rows)

Array içindeki ilk veriyi de görüntülemek istersek

[gunce] # SELECT isim, kategori, kategori[1] FROM urunler limit 5;
       isim        |            kategori             |  kategori  
--------------------+---------------------------------+------------
iphone 8plus       | {elektronik,telefon}            | elektronik
iphone X           | {elektronik,telefon,iphone}     | elektronik
samsung galaxy S10 | {elektronik,telefon,samsung}    | elektronik
samsung galaxy S9  | {elektronik,telefon,samsung}    | elektronik
samsung n8808      | {elektronik,televizyon,samsung} | elektronik
(5 rows)

Array iki boyutluymuş gibi [1][1] dersek bişey bulamayacağı için bir değer getirmeyecektir sonuçta.

[gunce] # SELECT isim, kategori, kategori[1][1] FROM urunler limit 5;
       isim        |            kategori             | kategori
--------------------+---------------------------------+----------
iphone 8plus       | {elektronik,telefon}            |
iphone X           | {elektronik,telefon,iphone}     |
samsung galaxy S10 | {elektronik,telefon,samsung}    |
samsung galaxy S9  | {elektronik,telefon,samsung}    |
samsung n8808      | {elektronik,televizyon,samsung} |
(5 rows)

Array içindeki bir veriyi aramak istediğimizde WHERE koşulunda aranacak veriyi doğrudan eklersek hata alacağız.


[gunce] # SELECT isim, kategori FROM urunler WHERE kategori = 'telefon' limit 1;
ERROR:  malformed array literal: "telefon"
LINE 1: ...LECT isim, kategori FROM urunler WHERE kategori = 'telefon' ...
                                                            ^
DETAIL:  Array value must start with "{" or dimension information.

İçinde su geçen satırları bulmak için ANY ifadesini eşitliğin sağ tarafına yazarak bulabiliriz.
[gunce] # SELECT isim, kategori FROM urunler WHERE 'telefon' = ANY (kategori);
       isim        |           kategori         
--------------------+------------------------------
iphone 8plus       | {elektronik,telefon}
iphone X           | {elektronik,telefon,iphone}
samsung galaxy S10 | {elektronik,telefon,samsung}
samsung galaxy S9  | {elektronik,telefon,samsung}
(4 rows)

Belirli alan içinde arama yapmak istersek, örneğin array’in ikinci alanındaki değerler arasında bir arama yapmaktan bahsediyorum, aşağıdaki gibi ilerleyebiliriz.


[gunce] # SELECT isim, kategori FROM urunler WHERE kategori [2] = 'televizyon';
     isim      |            kategori           
----------------+---------------------------------
samsung n8808  | {elektronik,televizyon,samsung}
samsung nu8808 | {elektronik,televizyon,samsung}
(2 rows)

Array alanın güncellenmesi için güncellenmesini istediğiniz array sayısı neyse onu belirtmeniz yeterlidir.

[gunce] # UPDATE urunler SET kategori[2]='playstation' WHERE kategori[2] = 'playstation oyunları';


[gunce] # SELECT * FROM urunler WHERE kategori[2] = 'playstation';
      isim        |           kategori         
-------------------+------------------------------
pes 2019 ps4 oyun | {elektronik,playstation,ps4}
(1 row)

Array içindeki her bir veriyi farklı satırlara ayırmak isterseniz UNNEST fonksiyonunu kullanabilirsiniz.


[gunce] # SELECT isim, UNNEST(kategori) FROM urunler WHERE isim = 'iphone X';
  isim   | unnest   
----------+------------
iphone X | elektronik
iphone X | telefon
iphone X | iphone
(3 rows)

Sevgiler,

Comments

Popular posts from this blog

PGConf Europe 2018 Güncesi 1

Merhaba, Diğer tüm veritabanları arasında en popüler açık kaynak kodlu veritabanı olan PostgreSQL, tüm yıl boyunca farklı ülkelerde bir çok konferansa sahiplik yapmaktadır. En bilinenleri PGDay ve PGConf'dur. Ayrıca her yıl 2 Şubatta Brüksel’de yapılan FOSDEM etkinliğinde de PostgreSQL konuşmalarının yapıldığı bir oturum mutlaka olmaktadır. PostgreSQL etkinlik detaylarına bu linkten ulaşabilirsiniz. Bu yıl ki PGConf Europe konferansı Lizbon'da yapıldı. Konferansla ilgili izlenimlerimi, yaptığım neredeyse 6 günlük yolculuğun en başından tüm detaylarıyla birlikte paylaşmak istiyorum. Yolculuğumuz sevgili Seda ile birlikte Atatürk Havalimanı’ndan sabah 07:30’da Lizbon’a direk uçuşla başladı.  Hava şahaneydi ve uçuşumuz konforlu geçti. Koltuğumuz cam kenarı ve uçağın kanadının hemen yanındaydı (benim favori koltuklarım 24, 25, 26, 27 ve 28. sıradakiler) ve biz 27. sıradaydık. Bol bol resim çektik bulutların üstündeyken ve uçak kanatlı olanlardan.  Lizbon’a vardığımı...

PostgreSQL High Availability - Patroni 2

Patroni kurulumuyla ilgili oldukça fazla kaynak bulunmakta fakat kurulum ve yönetimini beraber barındıran kaynağa denk gelmedim. Bu yazıda hem Patroni kurulumu hem de kurulum sonrası yönetimiyle alakalı detaylara ulaşabilirsiniz. PostgreSQL cluster'larının yönetimi için kullanılan Patroni ile ilgili temel bilgilerin yer aldığı Autofailover üzerine hazırladığım yazı serisine aşağıdaki linklerden erişebilirsiniz. PostgreSQL ve Autofailover PostgreSQL'de Autofailover ve Patroni 1 (Giriş) PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim) PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi) Patroni, PostgreSQL veritabanlarının kurulumundan ve konfigürasyonundan sorumludur. Yani Patroni'yi kurduğumuz sunucular aynı zamanda Patroni ile kurulmuş PostgreSQL'leri barındıracak. Üç node'lu PostgreSQL ve üç node'lu ETCD cluster'larını oluşturacağım. Kuruluma önce üç no...

PostgreSQL High Availability - Patroni 1

Patroni, PostgreSQL HA (High Availability) Cluster yapısının kurulması ve yönetimi için kullanılan open source bir araçtır. Patroni, PostgreSQL Cluster’inin kurulumu (bootstrap), replikasyonunun kurulumu, PostgreSQL otomatik failover yapılması amacıyla kullanılır. Python ile yazılmıştır. Bir önceki yazıda PostgreSQL'de Autofailover araçlarının ne olduğu ve neden Autofailover'a gereksinim duyulduğu konusunda yazı paylaşmıştım. Yazıya buradan ulaşabilirsiniz. Patroni Kurulumu İçin Gereksinimler nedir? Patroni’nin tek başına kurulumu autofailover yapısını yapılandırmak için yeterli değildir. Patroni ile Autofailover yapısının kurulması için DCS (Distributed Configuration Store) araçlarından birine ihtiyaç vardır. Bunlardan bazıları; ETCD, Consul, ZooKeeper, Kubernetes. PostgreSQL üzerinde Autofailover araçlarından Patroni entegre edecekseniz DCS araçlarından birini kullanmanız gerekecek. DCS dediğimiz şey aslında Service Discovery araçlarından biri olduğundan bu iki tan...