اگر دو ستون حاوی اطلاعات JSON را با عملگرهای = و != با هم مقایسه کنیم، این مقایسه صرف نظر از محتوا و بر اساس فرمت اطلاعات انجام خواهد شد برای مثال اطلاعات JSON زیر، محتوای یکسانی دارند اما به دلیل خطوط فاصله بعد از فیلد last_name، فرمت یکسانی ندارند:
SQL> select count(*)
from dual
where ‘{“first_name“:”vahid”,”last_name“:“usefzadeh”}’ =
‘{“first_name“:”vahid”,”last_name“: “usefzadeh”}’;
COUNT(*)
——–
0
با پاک کردن خطوط فاصله، خروجی این پرس و جو برابر با 1 خواهد بود:
SQL> select count(*)
from dual
where ‘{“first_name“:”vahid”,”last_name“:“usefzadeh“}’ =
‘{“first_name“:”vahid”,”last_name“:“usefzadeh“}’;
COUNT(*)
——
1
دستور زیر هم مثال دیگری از محتوای یکسان و فرمت متفاوت است:
SQL>select count(*)
from dual
where ‘{“first_name“:”vahid”,”last_name“:”usefzadeh”}’ =
‘{“last_name“:”usefzadeh”,”first_name“:”vahid”}’;
COUNT(*)
——
0
در اوراکل 18c تابعی به نام JSON_EQUAL ارائه شد که بر اساس محتوا این مقایسه را انجام می دهد. قبل از انکه از این تابع استفاده کنیم، جدولی را ایجاد کرده و محتویات از نوع JSON را در آن ثبت می کنیم و سپس مقایسه را انجام خواهیم داد:
SQL>create table myt (id number,et1 varchar2(1000) CONSTRAINT cc1 CHECK (et1 IS JSON),et2 varchar2(1000) CONSTRAINT cc2 CHECK (et2 IS JSON));
Table created
SQL> insert into myt values(1,'{“first_name“:”vahid”,”last_name“:”usefzadeh”}’ , ‘{“first_name“:”vahid”,”last_name“:”usefzadeh”}’);
1 row inserted
SQL> insert into myt values(2,'{“first_name“:”vahid”,”last_name“:”usefzadeh”}’ , ‘{“last_name“:”usefzadeh”,”first_name“:”vahid”}’);
1 row inserted
SQL> insert into myt values(2,'{“first_name“:”vahid”,”last_name“:”usefzadeh”}’ , ‘{“last_name“:”usefzadeh”,”first_name“:”ALI”}’);
1 row inserted
SQL> commit;
Commit complete
SQL> select * from myt a where JSON_EQUAL(et1, et2);
SQL> select * from myt a where NOT JSON_EQUAL(et1, et2);
همچنین نتیجه مقایسه عملگرهای = و <> به صورت زیر است:
SQL> select * from myt a where et1=et2;
SQL> select * from myt a where et1<>et2;