Merhaba
Bazı legacy tablo tasarımlarında tek bir sütun içerisinde aralarına virgül(,), noktali virgül vb. gibi ayırıcılar koyup listeyi tek sütunda saklanabiliyor.
Örneğin:
id | username | roles |
1 | metin | ADMIN,EDITOR |
2 | fatih | EDITOR,MANAGER |
Yukarıdaki tabloda roles sütunu aslında bir text aralarına virgül koyularak liste buraya eklenmiş. Bazen bu listedeki veriler uzayıp gidebiliyor.
Böyle bir tabloda arama yapmak için PostgreSQL’deki string_to_array fonksiyonunun 2. parametresini kullanarak çözebiliriz.
Öncelikle fonksiyonun tanımına bakalım:
string_to_array
(string
text
,delimiter
text
[,null_string
text
] ) →text[]
Bu fonksiyon ile ayırıcı olrak belirtilen karater ile sütunu verip array olarak tek bir column’da elde edebilirsiniz. Böylece bu sütun üzerinde PostgreSQL’in array fonksiyonlarını çalıştırabilirsiniz.
Örnek bir sorgu:
SELECT string_to_array(roles, ',') AS role_list,* FROM users
Sonuç:
role_list | id | username | roles |
{ADMIN,EDITOR} | 1 | metin | ADMIN,EDITOR |
{EDITOR,MANAGER} | 2 | fatih | EDITOR,MANAGER |
Örneğin üzerinde arama yapmak için
WITH users_with_roles AS ( SELECT string_to_array(roles, ',') AS role_list,* FROM users) SELECT * FROM users_with_roles WHERE ADMIN = ANY(role_list)
Yukarıdaki gibi bir sorguda kullanabilirsiniz.Veyahut kendi senaryonuza göre burayı json encode edip farklı işlemler de gerçekleştirebilirsiniz.
İleri seviyede bu şekide bir view oluşturup her seferinde ana sorguyu yazmamak ta iyi bir fikir olabilir.
Kaynaklar: