Bütün bu müqayisə və çevirmə nəyə lazımdır axı? Təsəvvür elə, cədvəldə sətir kimi "42" var, amma sən onu rəqəm 42 ilə müqayisə etmək istəyirsən. İlk baxışdan — eyni şeydir. Amma database üçün bunlar tam fərqli şeylər ola bilər. PostgreSQL avtomatik olaraq başa düşməyəcək ki, sən nəyi nəzərdə tutmusan. Əgər o, fərqli tipləri necə müqayisə etdiyini anlamasan, qəribə nəticə və ya ümumiyyətlə error ala bilərsən.
Çevirmə də eyni cürdür. Bəzən text-i rəqəmə çevirmək lazımdır ki, nəyinsə neçə dənə olduğunu hesablaya biləsən. Bəzən də əksinə — rəqəmi gözəl şəkildə sətir kimi göstərmək istəyirsən. Və ya tarixi götürüb onu "01.01.2025" kimi göstərmək istəyirsən, çünki istifadəçiyə belə daha rahatdır.
Başqa bir nümunə: dəqiq dəyəri NUMERIC-də saxlayırsan, amma elmi hesablamalar üçün FLOAT istifadə etmək lazımdır. Belə hallarda açıq çevirmə olmadan keçinmək olmur.
Yaxşı xəbər odur ki, PostgreSQL bu işdə əladır. O, belə tapşırıqlar üçün çevik və başadüşülən alətlər verir. Əsas odur ki, necə istifadə etməyi biləsən və bir az “kapotun altına” baxmaqdan qorxmayasan. İndi də bunu edəcəyik.
Məlumat tiplərinin müqayisəsi
PostgreSQL ağıllı olmağa çalışır — məsələn, INTEGER və NUMERIC müqayisə olunursa, onları ortaq məxrəcə gətirib müqayisə edir. Bu normaldır, axı hər ikisi rəqəmdir.
Amma əgər sən sətiri boolean dəyəri ilə (TEXT və BOOLEAN) müqayisə etmək istəsən, database artıq başa düşməyəcək ki, nə istəyirsən. Bu tiplərin təbiəti tam fərqlidir və PostgreSQL sadəcə error verəcək. Eyni şey baş verəcək, əgər sən "42" sətirini 42 rəqəmi ilə açıq çevirmə olmadan müqayisə etməyə çalışsan.
Bu praktikada necə görünür? Bax, error verəcək nümunə:
SELECT '42' = 42; -- Error! Sətir və rəqəm çevirmə olmadan müqayisə edilmir
Amma belə yazsan, hər şey qaydasında olacaq:
SELECT '42'::INTEGER = 42; -- TRUE
Burada biz açıq şəkildə deyirik: “Zəhmət olmasa, əvvəlcə '42'-ni rəqəmə çevir”. Bunun üçün ::Tip sintaksisi var, artıq danışmışdıq. PostgreSQL dəqiq danışanda xoşlayır.
Rəqəm tiplərinin müqayisəsi
Rəqəm tipləri (INTEGER, NUMERIC, REAL) adətən bir-biri ilə uyğun gəlir, ona görə də onları asanlıqla müqayisə etmək olur:
SELECT 42 = 42.0; -- TRUE
SELECT 42::REAL = 42.0; -- TRUE
SELECT 42.0::NUMERIC = 42; -- TRUE
Amma diqqətli ol, floating point rəqəmlərlə (REAL) işləyəndə. Dəqiqlik limitinə görə belə rəqəmlər bəzən gözlənilməz davranır. Məsələn:
SELECT 0.1 + 0.2 = 0.3; -- FALSE
Bu, proqramlaşdırmada ən məşhur tapmacalardan biri deyil? Burada müqayisə FALSE qaytarır, çünki kompüter yaddaşında onluq rəqəmlər xüsusi saxlanılır.
Text tiplərinin müqayisəsi
Text tipləri ilə işləyəndə CHAR, VARCHAR və TEXT-i müqayisə edə bilərsən, çünki PostgreSQL onları avtomatik uyğun tiplərə çevirir:
SELECT 'Hello' = 'Hello'::TEXT; -- TRUE
SELECT 'World'::CHAR(5) = 'World'::VARCHAR; -- TRUE
CHAR(n)-də simvolların uzunluğuna fikir ver: əgər sətir göstərilən uzunluqdan qısadırsa, PostgreSQL onu boşluqlarla dolduracaq.
Məlumat tiplərinin çevrilməsi
PostgreSQL məlumat tiplərini çevirmək üçün bir neçə üsul verir. İki əsas metodu nəzərdən keçirəcəyik:
Metod №1: Açıq çevirmə (CAST)
CAST operatoru bir tipin digər tipə necə çevriləcəyini göstərməyə imkan verir. Məsələn:
SELECT CAST('42' AS INTEGER); -- '42' sətirini 42 rəqəminə çevirir
Bu üsul xüsusilə SQL kodunu daha oxunaqlı etmək istəyəndə rahatdır.
Metod №2: Qısa yazılış (::)
PostgreSQL çevirmə üçün alternativ sintaksis təklif edir — :: istifadə etmək. Eyni əməliyyatdır, sadəcə daha qısa yazılır:
SELECT '42'::INTEGER; -- CAST('42' AS INTEGER) ilə eynidir
Avtomatik çevirmə
Çox vaxt PostgreSQL məlumatları avtomatik çevirir. Məsələn, sətir sahəsində rəqəm istifadə edəndə:
SELECT '42' = 42::TEXT; -- TRUE
Amma avtomatik çevirməyə həmişə güvənmək olmaz, çünki başqa developer-lər üçün gözlənilməz ola bilər. Xüsusilə tarix və sətir ilə işləyəndə açıq çevirmə daha yaxşıdır.
Fərqli məlumat tiplərinin çevrilməsi nümunələri
Rəqəmləri text-ə çevirmək
Bəzən rəqəmləri text-ə çevirmək lazım olur (məsələn, mesaj formalaşdırmaq üçün):
SELECT 42::TEXT; -- 42 rəqəmini '42' sətirinə çevirir
SELECT 3.14::TEXT; -- 3.14 rəqəmini '3.14' sətirinə çevirir
Text-i rəqəmə çevirmək
Əgər sətirdə düzgün rəqəm varsa, onu rəqəm tipinə çevirə bilərsən:
SELECT '123'::INTEGER; -- '123' sətirini 123 rəqəminə çevirir
SELECT '3.14'::FLOAT; -- '3.14' sətirini 3.14 rəqəminə çevirir
Bəs text çevrilməyə uyğun olmasa nə olacaq? Məsələn:
SELECT 'Hello'::INTEGER; -- Error: 'Hello' rəqəmə çevrilə bilmir
Belə error-lardan qaçmaq üçün TRY_CAST() funksiyasından (PostgreSQL 14-dən başlayaraq) və ya əvvəlcədən məlumatı yoxlamaqdan istifadə edə bilərsən.
Tarixi text-ə və əksinə çevirmək
Tarixləri çevirmək üçün TO_CHAR() və TO_DATE() funksiyalarından istifadə edə bilərsən:
SELECT TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD'); -- Tarixi sətirə çevirir
SELECT TO_DATE('2023-10-25', 'YYYY-MM-DD'); -- Sətiri tarixə çevirir
BOOLEAN və text arasında çevirmə
BOOLEAN məntiqi tipini də sətirə çevirmək olur:
SELECT TRUE::TEXT; -- 'true'
SELECT FALSE::TEXT; -- 'false'
Və ya əksinə:
SELECT 'true'::BOOLEAN; -- TRUE
SELECT 'false'::BOOLEAN; -- FALSE
Diqqət et, 'yes' və ya 'no' kimi sətirlər avtomatik çevrilməyəcək.
Praktika: hər şey real nümunələrlə
Fərqli məlumat tiplərindən istifadəni göstərən bir cədvəl yaradaq:
| id | number_as_text - TEXT | number_as_integer - INTEGER | date_as_text - TEXT | actual_date - DATE |
|---|---|---|---|---|
| 1 | 42 | 42 | 2023-10-25 | 2023-10-25 |
| 2 | 3.14 | NULL | 2023-10-24 | NULL |
| 3 | Hello | 123 | NULL | NULL |
İndi çevirmə əməliyyatlarını icra edək:
-- Text-i rəqəmə çevirmək
SELECT number_as_text::INTEGER FROM data_types_demo WHERE number_as_text = '42';
-- Tarixi text-ə çevirmək
SELECT TO_CHAR(actual_date, 'DD/MM/YYYY') FROM data_types_demo;
-- Sətiri tarixə çevirmək
SELECT TO_DATE(date_as_text, 'YYYY-MM-DD') FROM data_types_demo;
Məlumat çevirmədə tipik səhvlər
Tipik səhvlərə daxildir:
- Gözlənilən formata uyğun olmayan məlumatı çevirməyə cəhd etmək (məsələn,
'Hello'sətiriniINTEGER-ə çevirmək). - Floating point rəqəmlərlə işləyəndə yuvarlaqlaşdırma və dəqiqlik problemləri.
- Tarix çevirmədə formatdan düzgün istifadə etməmək.
Səhvlərin qarşısını almaq üçün tövsiyə olunur:
- Çevirmədən əvvəl həmişə məlumatı yoxla.
- Error-ları idarə edən funksiyalardan istifadə et (
TRY_CASTvə yaCASE). - Tarix çevirmədə formatı açıq göstər.
-- Çevirmədən əvvəl məlumatı yoxlamaq
SELECT
CASE
WHEN number_as_text ~ '^\d+$' THEN number_as_text::INTEGER
ELSE NULL
END AS safe_integer
FROM data_types_demo;
Bu yanaşmadan istifadə et ki, sorğularını gözlənilməz hallardan qoruya biləsən!
Bu mərhələdə artıq PostgreSQL-də məlumat tiplərini müqayisə və çevirmək üçün əsas bacarıqlara maliksən. Qalır ancaq praktika, praktika və bir də praktika. Növbəti leksiyalarda görüşərik!
GO TO FULL VERSION