کنترل دیتای null در زمان استفاده از order by(با کمک عباراتNULLS LAST و NULLS FIRST)

قصد داریم لیستی از جداول موجود در بانک را بر اساس تعداد رکوردی که دارند، به صورت نزولی نمایش دهیم به این جهت، با فرض بروز بودن statisticها، به سراغ ویوی dba_tables خواهیم رفت وبا کمک عبارت order by desc، خروجی را بر اساس ستون num_rows مرتب می کنیم.

select owner,table_name,num_rows from dba_tables order by num_rows desc;

همانطور که می بینید، در ستون num_rows، مقداری برای جداولی که در ابتدای این لیست قرار گرفته اند، ثبت نشده است و به طور کلی، در این شیوه مرتب سازی، رکوردهایی که در ستون مرتب شده، مقدار null دارند، در ابتدای لیست قرار می گیرند.

این مسئله در زمانی که بخواهیم جداول با رکوردهای بیشتر را در ابتدای لیست قرار دهیم، قابل قبول نخواهد بود.

برای حل این مسئله، روشهای مختلفی وجود دارد، برای مثال، با فیلتر کردن رکوردهایی که فیلد NUM_ROWS آنها برابر با NULL است، می توان به این هدف رسید:

select owner, table_name, num_rows

  from dba_tables

 where num_rows is not null

 order by num_rows desc

البته این دستور، به صورت کلی، رکوردهای که فیلد num_rows آنها برابر با null است را نمایش نمی دهد! در صورتی که بخواهیم اسامی این جداول در انتهای خروجی قرار بگیرند، می توانیم به جای فیلتر کردن رکوردها، از تابع NVL کمک بگیریم:

ORDER BY NVL(num_rows, -1)

راه حل دیگر و البته بهتر این مسئله، استفاده از عبارت NULLS LAST به همراه عبارت ORDER BY می باشد. این عبارت سبب خواهد شد تا رکوردهای NULL در انتهای لیست قرار بگیرند:

select owner, table_name, num_rows

  from dba_tables

 order by num_rows desc nulls last

در زمان استفاده از عبارت ORDER BY به همراه عبارت ASC، مقادیر NULL بعد از مقادیر NOT-NULL نمایش داده خواهند شد در این صورت، استفاده از عبارت NULLS FIRST، سبب نمایش مقادیر NULL در ابتدای لیست می شود.

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

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