Muntazam ifodalar
Ushbu qo'llanmada PostgreSQLda matn qatorlarini qidirish va mosliklarni aniqlash uchun POSIX muntazam ifodalaridan (regular expressions) qanday foydalanishni o'rganasiz.
Muntazam ifoda (regular expression yoki regex) — bu qidiruv shablonini belgilaydigan belgilar ketma-ketligidir.
Masalan, \d+ muntazam ifodasi bir yoki bir nechta raqamga mos keladi. Ular aniq bir raqam emas, balki istalgan raqamlar bo'lishi mumkin. Masalan, "iPhone 15" matni \d muntazam ifodasiga mos tushadi.
PostgreSQL POSIX (Portable Operating System Interface) standarti tomonidan belgilangan POSIX muntazam ifodalarini qo'llab-quvvatlaydi.
POSIXdan tashqari yana bir mashhur standart Perl Compatible Regular Expressions (PCRE) hisoblanadi. PostgreSQL PCRE standartini to'g'ridan-to'g'ri o'z ichiga olmaydi, balki POSIX standartiga tayanadi.
Keling, POSIX muntazam ifodalari qanday ishlashini ko'rib chiqamiz.
\d — istalgan raqamga mos keladi. Bu [0-9] ga teng.\s — istalgan bo'sh joy (probel, tab va h.k.) belgisiga mos keladi.\w — harflar, raqamlar va pastki chiziqni o'z ichiga olgan istalgan so'z belgisiga mos keladi. Bu [a-zA-Z0-9_] ga teng.\D — raqam bo'lmagan istalgan belgiga mos keladi, [^0-9] ga teng.\S — probel bo'lmagan istalgan belgiga mos keladi.\W — so'z belgisi bo'lmagan istalgan belgiga mos keladi.Anchorlar aniq belgilarga emas, balki qatordagi o'rniga mos keladi:
^ — qatorning boshlanishiga mos keladi.$ — qatorning oxiriga mos keladi.Quantifierlar belgilar to'plamining necha marta takrorlanishini belgilaydi:
* — 0 yoki undan ko'p marta.+ — 1 yoki undan ko'p marta.? — 0 yoki 1 marta.{n} — aynan n marta.{n,} — kamida n marta.{n,m} — n dan m gacha bo'lgan oraliqda (n < m).To'plamdagi istalgan bitta belgiga mos kelish uchun kvadrat qavslardan [] foydalaning. Masalan, [abc] belgisi a, b yoki c ga mos keladi.
Kvadrat qavs ichida oraliq belgilash uchun defis - ishlatiladi. Masalan, [a-z] — a dan z gacha bo'lgan kichik harflar oralig'i. [0-9] — 0 dan 9 gacha bo'lgan raqamlar oralig'i.
To'plam yoki oraliqni istisno qilish uchun qavs boshida ^ belgisini qo'llang. Masalan, [^0-9] raqamlardan tashqari istalgan belgiga mos tushadi.
Bir nechta variantdan birini tanlash uchun | (yoki / OR operatori) ishlatiladi. Masalan, a|b ifodasi a yoki b ga mos keladi.
PostgreSQL POSIX muntazam ifodalarini tekshirish uchun quyidagi operatorlarni taqdim etadi:
~ — shablon qator ichida mavjudligini tekshiradi (katta-kichik harfga sezgir / case-sensitive).~* — shablon qator ichida mavjudligini tekshiradi (katta-kichik harfga sezgir emas / case-insensitive).!~ — shablon qator ichida mavjud emasligini tekshiradi (katta-kichik harfga sezgir).!~* — shablon qator ichida mavjud emasligini tekshiradi (katta-kichik harfga sezgir emas).Misollarni bajarish uchun quyidagi products jadvalini yaratib olamiz:
DROP TABLE IF EXISTS products;
CREATE TABLE products (
product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
product_name VARCHAR(100) NOT NULL
);
INSERT INTO products (product_name) VALUES
('Samsung QN900C Neo QLED'),
('Sony HT-A7000 Soundbar'),
('HP Spectre x360'),
('Samsung Galaxy S24'),
('Huawei Mate 60'),
('Apple iPhone 15'),
('Samsung Galaxy Z Fold 5'),
('Apple iPhone 15 Pro Max'),
('Samsung Galaxy Tab S9'),
('Samsung Galaxy Buds Pro 2'),
('Samsung Galaxy Watch 6'),
('Xiaomi Mi 14'),
('Dell XPS 15'),
('Dell Inspiron 27'),
('Bose SoundLink Max');
Quyidagi so'rov moslik operatori ~ dan foydalanib, nomi ketma-ket uchta raqamdan iborat bo'lgan mahsulotlarni topadi:
SELECT
product_name
FROM
products
WHERE
product_name ~ '\d{3}';
Natija:
product_name
-------------------------
Samsung QN900C Neo QLED
Sony HT-A7000 Soundbar
HP Spectre x360
Quyidagi so'rov S harfi va undan keyin aynan ikki xonali raqam kelgan mahsulotlarni qidiradi (S\d{2}):
SELECT
product_name
FROM
products
WHERE
product_name ~ 'S\d{2}';
Natija:
product_name
--------------------
Samsung Galaxy S24
Quyidagi so'rov moslik operatori ~ yordamida nomi H harfi bilan boshlanadigan mahsulotlarni tanlaydi:
SELECT
product_name
FROM
products
WHERE
product_name ~ '^H';
Natija:
product_name
----------------
Huawei Mate 60
HP Spectre x360
Quyidagi so'rov nomi oxirida ikkita raqam bilan tugaydigan mahsulotlarni topadi:
SELECT
product_name
FROM
products
WHERE
product_name ~ '\d{2}$';
Natija:
product_name
--------------------
Samsung Galaxy S24
Apple iPhone 15
Huawei Mate 60
Xiaomi Mi 14
Dell XPS 15
HP Spectre x360
Dell Inspiron 27
Quyidagi so'rov ~ operatori yordamida nomi ichida "iPhone" yoki "Galaxy" so'zlari mavjud mahsulotlarni chiqaradi:
SELECT
product_name
FROM
products
WHERE
product_name ~ 'iPhone|Galaxy';
Natija:
product_name
----------------------------
Samsung Galaxy S24
Apple iPhone 15
Samsung Galaxy Z Fold 5
Apple iPhone 15 Pro Max
Samsung Galaxy Tab S9
Samsung Galaxy Buds Pro 2
Samsung Galaxy Watch 6
Katta va kichik harflarni farqlamasdan (case-insensitive) qidirish uchun ~* operatoridan foydalanishingiz mumkin:
SELECT
product_name
FROM
products
WHERE
product_name ~* 'iphone|galaxy';
Natija:
product_name
----------------------------
Samsung Galaxy S24
Apple iPhone 15
Samsung Galaxy Z Fold 5
Apple iPhone 15 Pro Max
Samsung Galaxy Tab S9
Samsung Galaxy Buds Pro 2
Samsung Galaxy Watch 6
Quyidagi so'rov !~ operatori yordamida nomida hech qanday raqam (\d+) bo'lmagan mahsulotlarni topadi:
SELECT
product_name
FROM
products
WHERE
product_name !~ '\d+';
Natija:
product_name
--------------------
Bose SoundLink Max
~, ~*, !~, va !~* operatorlaridan foydalaniladi.\d, \s, \w kabi sinflar, ^ va $ anchorlari hamda miqdor ko'rsatkichlari yordamida istalgan murakkablikdagi qidiruv shablonlarini shakllantirish mumkin.