Əsas səhifə > MySQL, Oracle, Oracle SQL > Oracle general functions in MySQL

Oracle general functions in MySQL

“General functions simplify working with columns that potentially contain null values.
These functions accept input parameters of all types”

Və bu siyahıya NVL, NVL2, NULLİF, COALESCE daxildir.

NVL
Funksiya məqsədi qısa olaraq:
The NVL function evaluates whether a column or expression of any data type is null
or not. If the term is null, an alternative not null value is returned; otherwise, the
initial term is returned.

Əyani olaraq test edək. commission_pct-də null qiymətlər var bu səbəblə count() az çıxardır:

select count(commission_pct) from employees;
>>> 35

Gördüyümüz kimi az çıxartdı çünki null-ları exclude etdi. Çıxış yolu kimi NVL istifadə edəcik:

select count(nvl(commission_pct,0)) from employees;
>>> 107

Burda NVL funksiyası commission_pct-də NULL gördüyü yerlərdə 0 atdı və count da öz növbəsində
düzgün hesabladı.
Daha aydın sadə bir misal:

select nvl(null,0) from dual;
>>> 0

MySQL-də NVL-i əvəzləyən funksiya IFNULL()-dur.
Bu məqsədlə nümunə cədvəlimizi yaradaq:

create table nulling(
id int not null auto_increment,
first_name varchar(25),
last_name varchar(25),
commission double(8,2),
primary key(id)
);

insert into nulling(first_name,last_name,commission) 
values('x','y',0.5),('x','y',0.5),
('x','y',0.5),('x','y',0.5),
('x','y',null),('x','y',null),('x','y',null),('x','y',null);

mysql> select * from nulling;
+----+------------+-----------+------------+
| id | first_name | last_name | commission |
+----+------------+-----------+------------+
|  1 | x          | y         |       0.50 |
|  2 | x          | y         |       0.50 |
|  3 | x          | y         |       0.50 |
|  4 | x          | y         |       0.50 |
|  5 | x          | y         |       NULL |
|  6 | x          | y         |       NULL |
|  7 | x          | y         |       NULL |
|  8 | x          | y         |       NULL |
+----+------------+-----------+------------+
8 rows in set (0.00 sec)

Test edək:

mysql> select count(commission) from nulling;
+-------------------+
| count(commission) |
+-------------------+
|                 4 |
+-------------------+
1 row in set (0.03 sec)

mysql> select count(ifnull(commission,0)) from nulling;
+-----------------------------+
| count(ifnull(commission,0)) |
+-----------------------------+
|                           8 |
+-----------------------------+
1 row in set (0.00 sec)

Yuxarıdakına bənzər sadə misal:

mysql> select ifnull(null,0) from dual;
+----------------+
| ifnull(null,0) |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

Lakin Oracle-da NVL funksiyasının önəmli şərtlərindən biri NVL(original,
ifnull) şərtində The data types of the original and ifnull
parameters must always be compatible.
Yəni data tiplər uyğun olmalıdır.

select first_name, last_name, nvl(commission_pct,'Null qiymet') from employees;
>>> ORA-01722: invalid number
01722. 00000 -  "invalid number"

Lakin MySQL-də belə bir məhdudiyyət yoxdur:

mysql> select last_name, first_name, ifnull(commission,'Null qiymet') from nulling;
+-----------+------------+----------------------------------+
| last_name | first_name | ifnull(commission,'Null qiymet') |
+-----------+------------+----------------------------------+
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | 0.50                             |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
| y         | x          | Null qiymet                      |
+-----------+------------+----------------------------------+
8 rows in set (0.00 sec)

NVL2
It evaluates whether a column or expression of any data type is null or not.
If the first term is not null, the second parameter is returned, else the third parameter is
returned.

NVL-ə oxşar olan bu funksiya 3 parametr qəbul edir. Əgər 1-ci NULL deyilsə 2-ci parametr qaytarılır, əgər 1ci NULL-dursa 3-cü.

select nvl2(null,'NULL deyil','NULL-dur') from dual;
>>> NULL-dur

select nvl2(1,'NULL deyil','NULL-dur') from dual;
>>> NULL deyil

MySQL-də belə bir funksiya yoxdur onun əvəzinə İF() istifadə edəcik:

mysql> select if(null,'NULL deyil','NULL-dur') from dual;
+----------------------------------+
| if(null,'NULL deyil','NULL-dur') |
+----------------------------------+
| NULL-dur                         |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select if(1,'NULL deyil','NULL-dur') from dual;
+-------------------------------+
| if(1,'NULL deyil','NULL-dur') |
+-------------------------------+
| NULL deyil                    |
+-------------------------------+
1 row in set (0.00 sec)

NULLIF
Oracle və MySQL-də mövcuddur eyni funksionallığı yerinə yetirir:

-- Oracle
select nullif(1,1) from dual;
>>> NULL

select nullif(1,2) from dual;
>>> 1

-- MySQL

mysql> select nullif(1,1) from dual;
+-------------+
| nullif(1,1) |
+-------------+
|        NULL |
+-------------+
1 row in set (0.00 sec)

mysql> select nullif(1,2) from dual;
+-------------+
| nullif(1,2) |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

COALESCE
Eyni adlı funksiya hər 2 RDBMS-də var və eyni işi görürlər.

-- Oracle

select coalesce(null,null,null) from dual;
>>> NULL

select coalesce(null,1,2) from dual;
>>> 1

select coalesce(3,1,2) from dual;
>>> 3

-- MySQL

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

mysql> select coalesce(null,1,2) from dual;
+--------------------+
| coalesce(null,1,2) |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

mysql> select coalesce(3,1,2) from dual;
+-----------------+
| coalesce(3,1,2) |
+-----------------+
|               3 |
+-----------------+
1 row in set (0.00 sec)

Təşəkkürlər😉

  1. gwilliams127
    Mart 5, 2015 tarixində, saat 23:41

    I don’t speak your language, but your wonderful examples still got me through a tricky assignment. Thank you.

  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: