CodeGym /Kurslar /SQL SELF /Məlumat tiplərinin müqayisəsi və çevrilməsi

Məlumat tiplərinin müqayisəsi və çevrilməsi

SQL SELF
Səviyyə , Dərs
Mövcuddur

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, INTEGERNUMERIC 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ə (TEXTBOOLEAN) 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, VARCHARTEXT-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()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:

  1. Gözlənilən formata uyğun olmayan məlumatı çevirməyə cəhd etmək (məsələn, 'Hello' sətirini INTEGER-ə çevirmək).
  2. Floating point rəqəmlərlə işləyəndə yuvarlaqlaşdırma və dəqiqlik problemləri.
  3. 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_CAST və ya CASE).
  • 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!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION