در این مقاله، با نحوه کار با آرایهها در PostgreSQL و استفاده از توابع کاربردی برای دستکاری آرایهها آشنا خواهید شد.
معرفی نوع داده آرایه در PostgreSQL
در PostgreSQL، آرایه مجموعهای از عناصری است که همگی دارای یک نوع داده مشابه هستند. آرایهها میتوانند یکبعدی، چندبعدی و حتی تودرتو باشند.
هر نوع داده در PostgreSQL یک نوع آرایه معادل دارد. بهعنوان مثال، نوع داده integer دارای آرایهای با نوع integer[] و نوع character دارای آرایهای با نوع character[] است.
همچنین، اگر یک نوع داده کاربر تعریف کنید، PostgreSQL به طور خودکار نوع آرایهی مرتبط با آن را ایجاد میکند.
برای تعریف یک ستون با نوع آرایه، از سینتکس زیر استفاده میکنید:
column_name datatype []
در این سینتکس، یک آرایه یکبعدی از نوع datatype تعریف میشود.
مثال: ایجاد جدول با ستون آرایه
در مثال زیر، جدولی به نام contacts ایجاد میکنیم که ستون phones به صورت آرایهای از نوع TEXT تعریف شده است:
CREATE TABLE contacts (
id SERIAL PRIMARY KEY,
name VARCHAR (100),
phones TEXT []
);
در اینجا، ستون phones یک آرایه یکبعدی است که شماره تلفنهای مختلف یک مخاطب را نگه میدارد.
تعریف آرایه چندبعدی
برای تعریف آرایههای چندبعدی، میتوانید از کروشههای اضافی استفاده کنید:
column_name data_type [][]
درج داده در آرایه
برای درج داده در ستون آرایه، از سینتکس زیر استفاده میشود:
INSERT INTO contacts (name, phones)
VALUES(‘John Doe’,ARRAY [ ‘(408)-589-5846′,'(408)-589-5555’ ]);
در این مثال، از سازنده ARRAY برای ساختن آرایه و درج آن در جدول contacts استفاده شده است.
همچنین میتوانید از آکولادها برای درج داده استفاده کنید:
INSERT INTO contacts (name, phones)
VALUES(‘Lily Bush’,'{“(408)-589-5841”}’),
(‘William Gate’,'{“(408)-589-5842″,”(408)-589-58423”}’);
در اینجا دو ردیف به جدول contacts اضافه میشود.
پرس و جو از دادههای آرایه
برای بازیابی دادهها از جدول contacts، از دستور زیر استفاده میکنیم:
SELECT
name,
phones
FROM
contacts;
نتیجه:
name | phones
————–+———————————-
John Doe | {(۴۰۸)-۵۸۹-۵۸۴۶,(۴۰۸)-۵۸۹-۵۵۵۵}
Lily Bush | {(۴۰۸)-۵۸۹-۵۸۴۱}
William Gate | {(408)-589-5842,(408)-589-58423}
برای دسترسی به یک عنصر آرایه، میتوانید از زیرنویس استفاده کنید:
SELECT
name,
phones [1]
FROM
contacts;
نتیجه:
name | phones
————–+—————-
John Doe | (۴۰۸)-۵۸۹-۵۸۴۶
Lily Bush | (۴۰۸)-۵۸۹-۵۸۴۱
William Gate | (408)-589-5842
همچنین میتوانید از عناصر آرایه در بخش WHERE برای فیلتر کردن ردیفها استفاده کنید. به عنوان مثال، این کوئری مخاطبانی را پیدا میکند که شماره تلفن (۴۰۸)-۵۸۹-۵۸۴۲۳ را بهعنوان دومین شماره تلفن خود دارند:
SELECT
name
FROM
contacts
WHERE
phones [2] = ‘(408)-589-58423’;
نتیجه:
markdown
Copy code
name
————–
William Gate
اصلاح آرایه در PostgreSQL
PostgreSQL به شما این امکان را میدهد که هر عنصر آرایه یا کل آرایه را بهروزرسانی کنید.
برای مثال، بهروزرسانی دومین شماره تلفن William Gate:
UPDATE contacts
SET phones [2] = ‘(408)-589-5843’
WHERE ID = 3
RETURNING *;
نتیجه:
id | name | phones
—-+————–+———————————
۳ | William Gate | {(408)-589-5842,(408)-589-5843}
برای بهروزرسانی کل آرایه:
UPDATE
contacts
SET
phones = ‘{“(408)-589-5843”}’
WHERE
id = 3
RETURNING *;
نتیجه:
bash
Copy code
id | name | phones
—-+————–+——————
۳ | William Gate | {(408)-589-5843}
جستجو در آرایه PostgreSQL
فرض کنید میخواهید بدانید چه کسی شماره تلفن (۴۰۸)-۵۸۹-۵۵۵۵ را دارد، بدون توجه به اینکه این شماره در کدام بخش از آرایه قرار دارد. برای این کار میتوانید از تابع ANY() استفاده کنید:
SELECT
name,
phones
FROM
contacts
WHERE
‘(۴۰۸)-۵۸۹-۵۵۵۵’ = ANY (phones);
نتیجه:
name | phones
———-+———————————
John Doe | {(408)-589-5846,(408)-589-5555}
تبدیل آرایهها به لیست
PostgreSQL تابع unnest() را ارائه میدهد که آرایهها را به یک لیست از ردیفها گسترش میدهد. به عنوان مثال، کوئری زیر تمامی شمارههای تلفن آرایهی phones را به لیست تبدیل میکند:
SELECT
name,
unnest(phones)
FROM
contacts;
نتیجه:
name | unnest
————–+—————-
John Doe | (۴۰۸)-۵۸۹-۵۸۴۶
John Doe | (۴۰۸)-۵۸۹-۵۵۵۵
Lily Bush | (۴۰۸)-۵۸۹-۵۸۴۱
William Gate | (408)-589-5843
خلاصه