Bəzən massivləri sadəcə oxumaq yox, həm də dəyişmək lazım olur: yeni dəyər əlavə etmək, köhnəni silmək, tərkibi yeniləmək. Xoşbəxtlikdən, PostgreSQL-də bunun üçün xüsusi funksiyalar var və onlar sayəsində massivlərin tərkibini rahat idarə edə bilərsən, əllə yazmağa ehtiyac qalmır: array_append() və array_remove(). Gəlin baxaq, bunlar necə işləyir.
array_append() ilə massivə element əlavə etmək
array_append() funksiyası massivə yeni element əlavə etmək üçündür və həmişə massivə axırda əlavə edir. İki arqument qəbul edir:
- Dəyişmək istədiyin orijinal massiv.
- Massivə əlavə etmək istədiyin dəyər.
Nümunə 1: Sadə ədədi massiv
Tutaq ki, projects adlı cədvəlimiz var və team_members sütununda layihə üzərində işləyən istifadəçilərin id-ləri massiv şəklində saxlanılır.
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
team_members INT[]
);
-- Bir neçə sətr əlavə edək
INSERT INTO projects (name, team_members)
VALUES
('Layihə A', ARRAY[1, 2, 3]),
('Layihə B', ARRAY[4, 5]);
İndi "Layihə A" layihəmiz var və team_members massivinə yeni üzv, id-si 7 olan istifadəçini əlavə etmək istəyirik. array_append() istifadə edirik:
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Layihə A';
-- Nəticəyə baxaq:
SELECT * FROM projects;
Nəticə:
| id | name | team_members |
|---|---|---|
| 1 | Layihə A | {1,2,3,7} |
| 2 | Layihə B | {4,5} |
Gördüyün kimi, ID-si 7 olan üzv uğurla massivə əlavə olundu!
Nümunə 2: Mətn elementlərinin əlavə olunması
Eyni array_append() funksiyasını başqa tip massivlər üçün də istifadə edə bilərsən. Məsələn, məhsul kateqoriyalarının massivinə yeni kateqoriya əlavə edək.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
categories TEXT[]
);
-- Məhsulu kateqoriyalarla əlavə edirik
INSERT INTO products (name, categories)
VALUES
('Smartfon', ARRAY['Elektronika', 'Qadcetlər']),
('Noutbuk', ARRAY['Kompüterlər', 'Elektronika']);
-- "Smartfon" üçün yeni "Populyar" kateqoriyası əlavə edirik
UPDATE products
SET categories = array_append(categories, 'Populyar')
WHERE name = 'Smartfon';
-- Nəticəyə baxaq:
SELECT * FROM products;
Nəticə:
| id | name | categories |
|---|---|---|
| 1 | Smartfon | {Elektronika,Qadcetlər,Populyar} |
| 2 | Noutbuk | {Kompüterlər,Elektronika} |
array_remove() ilə massivdən element silmək
array_append() yeni task əlavə etmək kimidirsə, array_remove() artıq bitmiş taskı siyahıdan silmək üçündür. Bu funksiya aşağıdakı arqumentləri qəbul edir:
- Orijinal massiv.
- Silinməsini istədiyin dəyər.
Nümunə 1: Ədədi massivdən elementin silinməsi
Gəlin yenə projects cədvəlinə baxaq. Məlum oldu ki, ID-si 7 olan üzv artıq "Layihə A" layihəsində işləmir. Onu team_members massivindən silirik:
UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Layihə A';
-- Nəticəyə baxaq:
SELECT * FROM projects;
Nəticə:
| id | name | team_members |
|---|---|---|
| 1 | Layihə A | {1,2,3} |
| 2 | Layihə B | {4,5} |
array_remove() funksiyası ID-si 7 olan üzvü uğurla sildi.
Nümunə 2: Mətn elementinin silinməsi
İndi isə products cədvəlinə baxaq. Əgər "Populyar" kateqoriyası artıq smartfon üçün aktual deyilsə, onu silə bilərik:
UPDATE products
SET categories = array_remove(categories, 'Populyar')
WHERE name = 'Smartfon';
-- Nəticəyə baxaq:
SELECT * FROM products;
Nəticə:
| id | name | categories |
|---|---|---|
| 1 | Smartfon | {Elektronika,Qadcetlər} |
| 2 | Noutbuk | {Kompüterlər,Elektronika} |
əgər silmək istədiyin element massivdə yoxdursa, array_remove() massivə heç bir dəyişiklik etmir. Bu çox rahatdır, çünki heç bir error çıxmır.
array_append() və array_remove() bir yerdə istifadə etmək
Bəzən əvvəlcə elementin massivdə olmadığından əmin olmaq, sonra əlavə etmək lazımdır. Bunu funksiyaları birləşdirərək edə bilərsən:
Nümunə: Unikal elementlərin əlavə olunması
Gəlin yoxlayaq ki, ID-si 7 olan üzv massivə yalnız orada yoxdursa əlavə olunur. Bunun üçün array_remove() ilə yoxlama aparırıq:
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Layihə A' AND NOT (team_members @> ARRAY[7]);
-- Nəticəyə baxaq:
SELECT * FROM projects;
İzah:
@>operatoru massivdə7elementinin olub-olmadığını yoxlayır.- Əgər
team_membersartıq7saxlayırsa, əlavə olunmur.
Tipik səhvlər və tövsiyələr
1. NULL massivə əlavə etmək cəhdi. Əgər array_append() ilə NULL əlavə etməyə çalışsan (array_append(team_members, NULL) kimi), massivə NULL dəyəri əlavə olunacaq. Heç bir error çıxmayacaq, amma nəticə gözlədiyin kimi olmaya bilər. Bunu istəmirsənsə, əvvəlcədən dəyərin NULL olmadığını yoxla.
-- Yoxlama nümunəsi:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Layihə A';
2. Massivdə fərqli data tipləri. PostgreSQL-də massivlər yalnız eyni tipli dəyərlər saxlamalıdır. Məsələn, ədədi massivə string əlavə edə bilməzsən:
-- Bu error verəcək:
UPDATE projects
SET team_members = array_append(team_members, 'example');
Bunu önləmək üçün data tiplərinin uyğun olduğuna əmin ol. Əmin deyilsənsə, dəyəri :: ilə uyğun tipə çevir:
-- Tip çevirmə nümunəsi:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
GO TO FULL VERSION