PostgreSQL’de sepeatör ile ayrılmış tek bir sütunu array’e çevirip arama yapma

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:

idusernameroles
1metinADMIN,EDITOR
2fatihEDITOR,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 ( stringtext, delimitertext [, null_stringtext ] ) → 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_listidusernameroles
{ADMIN,EDITOR}1metinADMIN,EDITOR
{EDITOR,MANAGER}2fatihEDITOR,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:

https://www.postgresql.org/docs/13/functions-array.html