Обновить
256K+

SQL *

Формальный непроцедурный язык программирования

97,53
Рейтинг
Сначала показывать
Порог рейтинга

Недостойное поведение Oracle DB

Сегодня база данных Oracle, была уличена в недостойном поведении, а именно в неявном преобразовании пустых строк к NULL

Посмотрите сами и убедитесь:

create table null_test (
    id int,
    test varchar(64)
);

insert into null_test values (1, 'Test');
insert into null_test values (2, null);
insert into null_test values (3, '');

select id, test, case when test is null then 'test is NULL' else 'test NOT NULL' end isNULL
from null_test;


select id, test
from null_test
where test = '';

Результат:

+====+========+===============+
| ID | TEST   | ISNULL        |
+====+========+===============+
| 1  | Test   | test NOT NULL |
| 2  | (null) | test is NULL  |
| 3  | (null) | test is NULL  |
+----+--------+---------------+

+====+======+
| ID | TEST |
+====+======+

Даже SQLITE известная своим пренебрежением к типам данных, не позволяет себе таких вольностей.

К сожалению, единственное что я могу сделать, это опубликовать этот пост чтобы предостеречь Вас от возможных ошибок.

Всего голосов 8: ↑7 и ↓1+6
Комментарии3

Компания Oracle выпустила новую версию своей базы данных Oracle 23c

Среди нововведений:

  • SELECT выражений без указания раздражающего FROM DUAL

select
  'Hello world'     as txt,
   7 * 6            as nmbr,
   sysdate          as sdate;
  • поддержка типа boolean (очень надеюсь что в ближайшее его завезут и в MySQL):

select true, false;

create table bool_test (
	val varchar2(10), 
	flg boolean
);

insert into bool_test values ('true'  , true );
insert into bool_test values ('false' , false);
insert into bool_test values ('null'  , null );
insert into bool_test values ('t'     ,'t'   );
insert into bool_test values ('yes'   ,'yes' );
insert into bool_test values ('True'  ,'True');
insert into bool_test values ('f'     ,'f'   );
insert into bool_test values ('0'     , 0    );

обратите внимание что строки 'y', 'yes', 't', 'true' неявно конвертируются в True, а значения 'n', 'no', 'f', 'false' в False в не зависимости от регистра и начальных/конечных пробелов. Число 0 сохраняется как False остальные любые числа как True

Поле типа boolean может быть использовано в where:

select * from bool_test where     flg;
select * from bool_test where not flg;

Вместе с новым типом данных введена новая функция to_boolean()

Некоторые плюшки из MySQL перенесены в Oracle. Например

  • DROP/CREATE TABLE IF [NOT] EXISTS

drop   table IF     EXISTS my_test;
create table IF NOT EXISTS my_test (num number, txt varchar2(10));
  • GROUP BY on expression aliases/position number

Все новые уже функции доступны на SQLize.online

Всего голосов 5: ↑5 и ↓0+5
Комментарии1