NUL গুলি প্রথমে বাছাই করা হয় কেন?


20

কেন এমন হয় যে যখন যখন আমাদের একটি কলামে একটি নাল মান হয় এবং আমরা যখন আরোহী মান অনুসারে অর্ডার করি তখন প্রথমে NULL বাছাই হয়?

select 1 as test
union all
select 2
union all
select NULL
union all
select 3
union all
select 4
order by test

ফলাফল স্বরূপ

NULL
1
2
3
4

আমি ভাবতে থাকি যে NULL এর অর্থ "নির্ধারিত" বা সম্ভাব্য "অজানা"। যদি এটি সত্য হয় তবে এগুলি কি শেষ বাছাই করে না, যেহেতু মানটি অন্যান্য মানগুলির চেয়ে বেশি হতে পারে? (বা এটি কোথাও বাছাইয়ের বিকল্প?)

আমি এসকিউএল সার্ভার ২০০৮ আর ২ তে আছি, তবে আমার সন্দেহ হয় এটি সমস্ত এসকিউএল সার্ভার এবং সম্ভবত সমস্ত আরডিবিএমএস জুড়েই সত্য।


1
ওরাকল এটি শেষ তালিকা করে। এটি আমাকে একবার বিভ্রান্ত করেছে, বিশ্বাস করে এটি এসকিউএল সার্ভারের মতো আচরণ করবে।
আন্দ্রে রেনিয়া

2
"যদি এটি সত্য হয় তবে এগুলি কি শেষ বাছাই করে না, যেহেতু মানটি অন্যান্য মানগুলির চেয়ে বড় হতে পারে"। মান অন্যান্য সমস্ত মানের চেয়েও কম হতে পারে। আমার কাছে এটি স্বজ্ঞাত যে নালীর মতো একটি মিথ্যা মানটি নীচের প্রান্তে হওয়া উচিত। এবং ব্যবহারিক, বাস্তবে, আপনি প্রায়শই descসবচেয়ে বড় বা সাম্প্রতিক বিষয়গুলি প্রদর্শন করার জন্য ক্রম ব্যবহার করতে চান, সেক্ষেত্রে নালাগুলি শেষ হওয়ার জন্য আমি খুশি হব।
মাহেমফ

ডাটাবেস আপনি যা করতে বলবেন তা করে। যদি আপনি জানেন যে আপনার ডেটাতে শূন্যস্থান রয়েছে এবং নির্দিষ্ট কিছু উপায়ে বাছাই করার জন্য আপনার কাছে কিছু ব্যবসায়িক কারণ রয়েছে, তবে আপনাকে কোয়েরিতে বা কোড / ভিউতে যা প্রক্রিয়ায় / ডেটা প্রেরণ করে তা নির্দিষ্ট করতে হবে। ডিফল্ট ডাটাবেস আচরণে বাছাই করা কখনও ছাড়বেন না।
অযৌক্তিকভাবে

উত্তর:


19

BOL : NULL এর একটি মান ইঙ্গিত দেয় যে মানটি অজানা। NULL এর মান একটি খালি বা শূন্য মানের থেকে আলাদা। দুটি নাল মান সমান নয়। দুটি নাল মান, বা একটি NULL এবং অন্য কোনও মানের মধ্যে তুলনা, অজানা ফিরে আসে কারণ প্রতিটি NULL এর মান অজানা।

নুল মানে অজানা। অন্য কোন ব্যাখ্যা বৈধ নয়।

যদি এটি সত্য হয় তবে এগুলি কি শেষ বাছাই করে না, যেহেতু মানটি অন্যান্য মানগুলির চেয়ে বেশি হতে পারে?

নেই হতে পারে । কোনও সম্ভাব্য মান নেই। অজানা অজানা অজানা।

এটি শেষের চেয়ে আগে কেন প্রকাশিত হয়, এটি প্রকাশিত এসকিউএল স্ট্যান্ডার্ড দ্বারা গৃহীত হয় না এবং দুর্ভাগ্যক্রমে আরডিবিএমএস বিক্রেতার বিবেচনায় রেখে যায়:

উইকিপিডিয়া : এসকিউএল স্ট্যান্ডার্ড নুলসের জন্য একটি ডিফল্ট সাজানোর ক্রমটি স্পষ্টভাবে সংজ্ঞায়িত করে না। পরিবর্তে, মেনে চলার সিস্টেমগুলিতে, নালস যথাক্রমে অর্ডার বাই তালিকার NULLS FIRST বা NULLS সর্বশেষ নংগুলি ব্যবহার করে সমস্ত ডেটা মানগুলির আগে বা পরে বাছাই করা যায়। তবে সমস্ত ডিবিএমএস বিক্রেতারা এই কার্যকারিতা বাস্তবায়ন করে না। এই কার্যকারিতা বাস্তবায়ন করেন না এমন বিক্রেতারা ডিবিএমএসে নাল বাছাইয়ের জন্য বিভিন্ন চিকিত্সা নির্দিষ্ট করতে পারেন।


সুতরাং, এটি একটি রায় কল। ওটা অনেক কিছু প্রকাশ করে. ধন্যবাদ!
রিচার্ড

6

আপনি সঠিক NULLযেটির অর্থ 'নির্ধারক' বা 'অজানা' বা 'এখনও জানা নেই' বা 'প্রয়োগ না করা' হতে পারে। তবে নুলসকে প্রথমে বা শেষ রাখার কোনও কারণ নেই। যদি আমরা প্রকৃত মানগুলি না জানি, তবে টিহী ছোট বা বড় হতে পারে।

আমি মনে করি বাছাইয়ের সময় নুলসের পছন্দসই আচরণ নির্ধারণের মানটি হ'ল:

ORDER BY 
    test NULLS LAST                      --- or NULLS FIRST for the opposite

দুর্ভাগ্যক্রমে এসকিউএল-সার্ভার এখনও এই বাক্য গঠনটি গ্রহণ করে নি। আমি যদি ভুল না হই তবে পোস্টগ্র্যাস এসকিউএল এবং ওরাকল এটি থাকে।

একটি সমাধান:

ORDER BY 
     CASE WHEN test IS NOT NULL 
            THEN 0 
          ELSE 1 
     END 
   , test

ডেটাটাইপ নির্ভর করে আর একটি সমাধানের সমন্বয় প্রয়োজন - তবে এটি ভালভাবে উপস্থাপিত হবে না কারণ এটি কোনও সূচক ব্যবহার করতে পারে না (test):

ORDER BY 
    COALESCE(test, 2147483647)               --- if it's a 4-byte signed integer

এইভাবে কলের মাধ্যমে অর্ডার (পরীক্ষা, 2147483647) এসকিউএল সার্ভার সূচকটি ব্যবহার করতে পারে না।
আর্দলান শাহঘোলি

3

আমি জানি না কেন এটি সেভাবে করা হয়েছে, তবে সংজ্ঞা অনুসারে নুলকে নন-নুলসের সাথে তুলনা করা যায় না, সুতরাং তাদের হয় শুরুতে বা শেষ দিকে যেতে হবে (মার্কের উত্তর এটি আরও বিস্তারিতভাবে কভার করে)।

আপনার পছন্দসই আচরণটি পেতে - যতদূর আমি জানি যে নালাগুলি শেষ রাখার কোনও বাছাই করার বিকল্প নেই, সুতরাং এগুলি শেষ করতে বাধ্য করার জন্য আপনাকে একটি গণিত কলাম ব্যবহার করে তা বজায় রাখতে হবে। তবে এসকিউএল সার্ভারে আপনি কোনও গণিত কলাম ( CASE WHEN ...) দ্বারা অর্ডার করতে পারবেন না যখন আপনার ডেটাতে সেট অপারেটর থাকে ( UNION ALL)) তাই:

CREATE TABLE #sorttest(test int)
INSERT INTO #sorttest values(1)
INSERT INTO #sorttest values(5)
INSERT INTO #sorttest values(4)
INSERT INTO #sorttest values(NULL)
INSERT INTO #sorttest values(3)
INSERT INTO #sorttest values(2)
SELECT test
FROM #sorttest
ORDER BY CASE WHEN test IS NULL THEN 1 ELSE 0 END, test

DROP TABLE #sorttest

সর্বশেষ নাল বাছাইয়ের জন্য কাজ করবে। আপনি ব্যবহার করতে থাকে তাহলে UNION(অথবা EXCEPTবা INTERSECTS) আপনার ডেটা সেট জেনারেট করতে, তারপর উপরের মতো একটি অস্থায়ী টেবিল থেকে আপনার ডেটা ডাম্প।


... বা উত্সযুক্ত টেবিল হিসাবে ইউনিয়নযুক্ত আউটপুট ব্যবহার করুন।
অ্যান্ড্রি এম

0

আপনি যদি সংখ্যাগুলি নিয়ে কাজ করে থাকেন তবে আপনি এটিও ব্যবহার করতে পারেন

ORDER BY -test DESC

NULLসর্বনিম্ন সম্ভাব্য মানগুলি, তাই DESCএগুলি শেষে রাখে। এদিকে নাল না মান চিহ্ন যাতে বিপর্যস্ত আছে DESCআসলে একটি হয় ASCবাস্তব মান উপর। এটির চেয়ে দ্রুত হওয়া উচিত CASEএবং আমি মনে করি যে ক্যোয়ারী অপ্টিমাইজারটি testকলামে সূচিগুলিও ব্যবহার করতে পারে ।


3
না, এটি বাছাইয়ের জন্য কোনও সূচক ব্যবহার করতে সক্ষম হবে না। গণনাযুক্ত এক্সপ্রেশনটিতে আপনার কোনও সূচি না থাকলে (- test)
ypercubeᵀᴹ

1
চতুর, যদিও কেবলমাত্র সংখ্যার ডেটা সীমাবদ্ধ (ওপির উদাহরণের জন্য উপযুক্ত)। আমি নিশ্চিত নই যে এটি সত্যই CASE ব্যবহারের চেয়ে দ্রুত হবে কিনা তবে আমি নিশ্চিত যে এটি কোনও সূচক ব্যবহার করবে না (যদি না এটি @ ypercubeᵀᴹ যা বলে - তবে তারপরে CASE এক্সপ্রেশনটি ঠিক একইভাবে সূচিযুক্ত করা যেতে পারে)।
অ্যান্ড্রি এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.