Əsas səhifə > MySQL > Logical OR və yaxud ||

Logical OR və yaxud ||

MySQL-də || və OR eyni şeydir. Lakin elə database-lər var ki, || – string concatenation operator(birləşdirmə operatoru) kimi istifadə olunur.
MySQL-də də biz || -nu birləşdirmə operatoru kimi istifadə edə bilərik. Bunun üçün PIPES_AS_CONCAT sql_mode-nu aktiv etməliyik:

mysql> set sql_mode='pipes_as_concat';
Query OK, 0 rows affected (0.00 sec)

mysql> select 'i am a'||' muslim';
+---------------------+
| 'i am a'||' muslim' |
+---------------------+
| i am a muslim       |
+---------------------+
1 row in set (0.00 sec)

Əvvəlki vəziyyətinə qaytarmaq üçün:

mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> select 'i am a'||' muslim';
+---------------------+
| 'i am a'||' muslim' |
+---------------------+
|                   0 |
+---------------------+
1 row in set, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'i am a'  |
| Warning | 1292 | Truncated incorrect DOUBLE value: ' muslim' |
+---------+------+---------------------------------------------+
2 rows in set (0.00 sec)

Lütfən Warning-lərə diqqət yetirək…Yuxarıdakından aydın olur ki ||-a string verdikdə o həmin string-i double-a (yəni rəqəmə) truncate(yəni bir növü çevirmə) edir…Bu zaman isə hər bir string 0 kimi götürülür.
Bunları yaddaşımızda saxlayaraq davam edirik…||-in işləmə prinsipi aşağıdakı qaydadadır:

1.Əgər operandlardan hər ikisi NULL-dursa və cavab NULL-dur. Həmçinin biri 0 və digəri NULL-dursa cavab yenə NULL-dur.
2.Əgər operandlardan hər ikisi 0-dırsa cavab 0-dır.
3. İstənilən digər hallarda,yəni, 1 və NULL, 1 və 0, 1 və 1 olduqda cavab 1-dir.

Əyani olaraq göstərək:

-- 1ci bend

mysql> select null||null;
+------------+
| null||null |
+------------+
|       NULL |
+------------+
1 row in set (0.00 sec)

mysql> select 0||null;
+---------+
| 0||null |
+---------+
|    NULL |
+---------+
1 row in set (0.00 sec)

-- 2ci bend

mysql> select 0||0;
+------+
| 0||0 |
+------+
|    0 |
+------+
1 row in set (0.00 sec)

-- 3cu bend

mysql> select 1||1;
+------+
| 1||1 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select 1||0;
+------+
| 1||0 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select 1||null;
+---------+
| 1||null |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

Və burdan həqiqətən də aydın olur ki, yuxarıda yazdığımız:

mysql> select 'i am a'||' muslim';
+---------------------+
| 'i am a'||' muslim' |
+---------------------+
|                   0 |
+---------------------+

Hansı səbəbdən cavabı 0 verir. Çünki 0||0=0 nəticəsini verir

mysql> select 0||0;
+------+
| 0||0 |
+------+
|    0 |
+------+

Yəni ‘i am a’=0 və ‘ muslim’=0 götürülür…Yuxarıda vurğuladığımız kimi səbəbi truncate-dir.
Sübut üçün bir neçə sınaq keçirdək:

mysql> select 'string'||0;
+-------------+
| 'string'||0 |
+-------------+
|           0 |
+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> select 'string'||1;
+-------------+
| 'string'||1 |
+-------------+
|           1 |
+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> select 'string'||null;
+----------------+
| 'string'||null |
+----------------+
|           NULL |
+----------------+
1 row in set, 1 warning (0.00 sec)

mysql> select 'string'||'string';
+--------------------+
| 'string'||'string' |
+--------------------+
|                  0 |
+--------------------+
1 row in set, 2 warnings (0.00 sec)

Və həqiqətən də ‘string’=0 götürülür🙂

Amma ancaq lakin mənə ən maraqlı gələn hissə ||(OR)-un SELECT-lərdə olan davranışıdır… İzah edək…Təsəvvür edək ki bizim bir table-ımız var:

create table students (
    stud_id int not null,
    stud_name varchar(25) not null,
    Stud_Phone int NOT NULL,
    Stud_Address varchar(50)
);

Diqqət edin! stud_id və stud_phone-nun data tipləri int-dir yəni number tipidir…stud_name və stud_address isə varchar yəni string tipidir…Dolayısı ilə bu column-larda number və string-lər yerləşəcək.

Və bu table-ımızda aşağıdakı məlumatlar olacaq:

insert into students() values(1,'Shahriyar','055496210','Yasamal');

insert into students() values(2,'Elvin','055444444','Yeni Yasamal');

İndi isə show başlasın😛 Select-lər verək və nəticələrə baxaq.Code içindəki commentlərə diqqət yetirin. Çünki təkrar nəyisə yazmaq əvəzinə comment-lərdə kiçik izahlar yazmışam:

-- 'string'||'string'=0 (0||0=0 oldugu ucun) 

mysql> SELECT stud_name||stud_address 
    -> from students
    -> WHERE Stud_ID = 1;
+-------------------------+
| stud_name||stud_address |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set, 2 warnings (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'Shahriyar' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'Yasamal'   |
+---------+------+-----------------------------------------------+
2 rows in set (0.00 sec)

-- 'string'||number=1 (0||1=1 oldugu ucun)

mysql> SELECT stud_name||stud_phone
    -> FROM students
    -> WHERE Stud_ID=1;
+-----------------------+
| stud_name||stud_phone |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'Shahriyar' |
+---------+------+-----------------------------------------------+
1 row in set (0.00 sec)

-- number||number=1 (1||1=1 oldugu ucun)

mysql> SELECT stud_phone||stud_phone
    -> FROM students
    -> WHERE Stud_ID=1;
+------------------------+
| stud_phone||stud_phone |
+------------------------+
|                      1 |
+------------------------+
1 row in set (0.00 sec)

-- NULL||'string'=NULL (NULL||0=NULL oldugu ucun)

mysql> SELECT NULL||stud_address 
    -> from students
    -> WHERE Stud_ID = 1;
+--------------------+
| NULL||stud_address |
+--------------------+
|               NULL |
+--------------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'Yasamal' |
+---------+------+---------------------------------------------+
1 row in set (0.01 sec)

-- NULL||number=1 (NULL||1=1 oldugu ucun)

mysql> SELECT NULL||stud_phone
    -> FROM students
    -> WHERE Stud_ID=1;
+------------------+
| NULL||stud_phone |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

Yuxarıdan belə başa düşmək olar ki, || operatoru select-dən qayıdan məlumatı tipinə görə müqayisə edir və mövzunun başlanğıcında göstərildiyi kimi öz iş prinsipinə əsasən output verir.

Düşünürəm ki kifayət qədər maraqlı mövzu oldu… Date tiplərində yoxlamamışam…Onu da sizlər yoxlasanız comment şəklində bildirərsiz…
Təşəkkürlər🙂

  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: