مقایسه دو مقدار JSON به کمک تابع JSON_EQUAL – اوراکل 18c

اگر دو ستون حاوی اطلاعات 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;

 

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.