কেন এএনএসআই এসকিউএল এসইউএমকে (কোনও সারি নেই) নুল হিসাবে সংজ্ঞায়িত করে?


28

ANSI এসকিউএল মান সংজ্ঞায়িত (অধ্যায় 6.5, সেট ফাংশন স্পেসিফিকেশন) খালি ফলাফলের সেটে সমষ্টিগত ফাংশন জন্য নিম্নলিখিত আচরণ:

COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL

গড়, ন্যূনতম এবং সর্বাধিক খালি সেট অপরিজ্ঞাত হওয়ায় এভিজি, এমআইএন এবং ম্যাক্সের জন্য নুল ফিরে আসা সঠিক ধারণা দেয়।

গত এক অবশ্য বিরক্তির আমিঃ গাণিতিকভাবে, একটি খালি সেট এর সমষ্টি ভালভাবে সংজ্ঞায়িত হয়: 0। 0, যোগের নিরপেক্ষ উপাদানটি ব্যবহার করে যেমন বেস কেসটি সবকিছুকে সামঞ্জস্যপূর্ণ করে তোলে:

SUM({})        = 0    = 0
SUM({5})       = 5    = 0 + 5
SUM({5, 3})    = 8    = 0 + 5 + 3
SUM({5, NULL}) = NULL = 0 + 5 + NULL

মূলত SUM({})হিসাবে সংজ্ঞা দিয়ে null"কোনও সারি নেই" একটি বিশেষ কেস তৈরি করে যা অন্যদের সাথে খাপ খায় না:

SUM({})     = NULL  = NULL
SUM({5})    = 5    != NULL + 5 (= NULL)
SUM({5, 3}) = 8    != NULL + 5 + 3 (= NULL)

আমি যে পছন্দটি করেছি (এসইউএমইউ এনইউএল হচ্ছে) যেটি আমি মিস করেছি তার কিছু স্পষ্ট সুবিধা আছে?



5
হ্যাঁ আমি সম্মত: COUNT এবং SUM ধারাবাহিকভাবে আচরণ করে না।
একে

উত্তর:


20

আমি ভীত যে কারণটি কেবল এই যে নিয়মগুলি অ্যাডহক ফ্যাশনে সেট করা হয়েছিল ( আইএসও এসকিউএল স্ট্যান্ডার্ডের অনেকগুলি "অন্যান্য বৈশিষ্ট্যগুলির মতো" ) এসকিউএল একীকরণ এবং গণিতের সাথে তাদের সংযোগ এখনকার চেয়ে কম বোঝা গিয়েছিল (*)।

এটি এসকিউএল ভাষার অত্যন্ত অসঙ্গতিগুলির মধ্যে একটি মাত্র। এগুলি ভাষা শেখানো শক্ত করে তোলে, শেখা শক্ত হয়, বোঝা শক্ত হয়, ব্যবহার করা শক্ত হয়, আপনি যা চান তার চেয়ে শক্ত করে তোলে, তবে বিষয়গুলি কেবল এটাই। পশ্চাদপদ সামঞ্জস্যের সুস্পষ্ট কারণে নিয়মগুলি "ঠান্ডা" এবং "ঠিক তেমন" পরিবর্তন করা যায় না (আইএসও কমিটি যদি মানটির একটি চূড়ান্ত সংস্করণ প্রকাশ করে, এবং বিক্রেতারা সেই মানটি বাস্তবায়নের জন্য প্রস্তুত হয়, তবে সেই বিক্রেতারা তাদের প্রশংসা করবে না এটি খুব বেশি যদি পরবর্তী সংস্করণে, নিয়মগুলি এমনভাবে পরিবর্তিত হয় যে স্ট্যান্ডার্ডের পূর্ববর্তী সংস্করণটির "(স্বয়ংক্রিয়ভাবে মেনে চলতে" ব্যর্থ হয় ") নতুন সংস্করণটি প্রয়োগ করা হয় (...)

(*) এটি এখন আরও ভালভাবে বোঝা গেছে যে খালি সেটগুলিতে একত্রিতকরণগুলি যদি নিয়মিতভাবে হাতে থাকা অন্তর্নিহিত বাইনারি অপারেটরের পরিচয় মান (= যাকে আপনি 'নিরপেক্ষ উপাদান' বলে থাকেন) ফেরত দেয় তবে তারা আরও ধারাবাহিকভাবে আচরণ করে । COUNT এবং SUM- র জন্য অন্তর্নিহিত বাইনারি অপারেটরটি অতিরিক্ত এবং এটির পরিচয় মান শূন্য। এমআইএন এবং ম্যাক্সের জন্য, সম্পর্কিত পরিচয় সীমাবদ্ধ থাকলে সেই পরিচয় মান হ'ল টাইপের সর্বাধিক এবং সর্বনিম্ন মান। গড়, সুরেলা উপায়, মিডিয়ান ইত্যাদির মতো ক্ষেত্রে যদিও এই ক্ষেত্রে অত্যন্ত জটিল এবং বহিরাগত।


আমার মনে হয় নূন্যতমটি সর্বনিম্ন এবং সর্বাধিক সহ একটি খালি সেট তৈরি করে। আপনি বলতে পারেন সেখানে একটি পরিচয় মান সত্যই অজানা, তবে কোনও কারণের যোগফল 0 নয় একই কারণে যে n * 0 সর্বদা 0 থাকে তবে নূন্যতম এবং সর্বাধিক পৃথক। আমি মনে করি না যে ফলাফলটি কোনও রেকর্ড ছাড়াই সঠিকভাবে সংজ্ঞায়িত হয়েছে।
ক্রিস ট্র্যাভারস

একটি নাল সেটকেও গড় () নাল হিসাবে বোঝায় কারণ 0/0 এই প্রসঙ্গে সঠিকভাবে সংজ্ঞায়িত করা হয়নি।
ক্রিস ট্র্যাভারস

5
MIN এবং MAX এর চেয়ে আলাদা নয়। একটি অন্তর্নিহিত বাইনারি অপারেটর যথাক্রমে LOWESTOF (x, y) এবং HIGHESTOF (x, y) নিন। এই বাইনারি অপারেটরগুলির একটি পরিচয়ের মান রয়েছে। কারণ উভয় ক্ষেত্রে (যদি জড়িত প্রকারটি সীমাবদ্ধ থাকে) তবে প্রকৃতপক্ষে কিছু মান z রয়েছে যা forall x: LOWESTOF (z, x) = x এবং forall y: HIGHESTOF (y, z) = y। (উভয় ক্ষেত্রেই পরিচয়ের মান একই নয়, তবে এটি উভয় ক্ষেত্রেই বিদ্যমান exist) আমি একমত যে ফলাফলগুলি প্রথম নজরে চূড়ান্তভাবে বিপরীত দেখায়, তবে গাণিতিক বাস্তবতা অস্বীকার করার কোনও কারণ নেই।
এরউইন স্মাউট

@ ইরউইন: আমি আপনার সমস্ত পয়েন্টের সাথে একমত, কিছু অপারেশনের পরিচয় যেমন HIGHEST()অনেকগুলি ডেটাটাইপের উপাদান নয়, যেমন -Infinity+InfinityLOWEST()
রিলের

1
@ এসকিউএল কিউই আপনি কি স্ট্যাটিক টাইপ চেকিং সম্পর্কে ভুলে যাচ্ছেন? সমষ্টি মত এক্সপ্রেশন () স্ট্যাটিক টাইপ পরীক্ষক দ্বারা পরিচালিত হয়, যেন তারা সবসময় একটি পূর্ণসংখ্যা ফিরে আসতে, তাহলে সম্ভবত এটি যোগ () আবাহন অসম্ভব কখনও কখনও এমন কিছু বিষয় যা হয় ফিরে যাও হওয়া উচিত না একটি পূর্ণসংখ্যা (যেমন একটি খালি সম্পর্ক)।
এরউইন স্মাউট

3

ব্যবহারিক অর্থে বিদ্যমান ফলাফল কার্যকর NULLis নিম্নলিখিত সারণী এবং বিবৃতি বিবেচনা করুন:

C1 C2
-- --
 1  3 
 2 -1 
 3 -2 

SELECT SUM(C2) FROM T1 WHERE C1 > 9;

SELECT SUM(C2) FROM T1 WHERE C1 < 9;

প্রথম বিবৃতিটি NULL এবং দ্বিতীয়টি শূন্য প্রদান করে। যদি একটি খালি সেট শূন্য ফিরে আসে তবে শূন্যের SUMএকটি সত্য যোগফল খালি সেট থেকে আলাদা করতে আমাদের অন্য উপায়ের প্রয়োজন হবে, সম্ভবত গণনাটি ব্যবহার করে। আমরা যদি সত্যিই শূন্য সেটটির জন্য শূন্য চাই তবে একটি সাধারণ COALESCEসেই প্রয়োজনীয়তা সরবরাহ করবে।

SELECT COALESCE(SUM(C2),0) FROM T1 WHERE C1 > 9;

1
ফলস্বরূপ।, সুম (সেট 1 এবং সেট 2 এর ইউনিয়ন) <> এসইউএম (সেট 1) + এসইউএম (সেট 2), কারণ যে কোনও সংখ্যা + এনইউএল = নুল। এটা কি আপনার বোঝার?
একে 15

2
@ লেইহ: COALESCE()এই জাতীয় ব্যবহার করে ( 0) সমষ্টি থেকে খালি সেটটির যোগফলকে আলাদা করা যাবে না NULL(বলুন টেবিলটির একটি (10, NULL)সারি ছিল ।
ypercubeᵀᴹ

তদাতিরিক্ত, আমরা এখনও এসএমএম (এক বা একাধিক এনএলএল এর সেট) থেকে এসএমএম (খালি সেট) আলাদা করতে পারি না। আমাদের কি আদৌ আলাদা করার দরকার আছে?
একে 15

@ অ্যালেক্সকুজনসভ - আমরা কমপক্ষে একটি সারিতে যতক্ষণ একটি মান থাকতে পারে তার মধ্যে একটি বা একাধিক নাল থাকে এমন একটি সেট থেকে একটি খালি সেটকে আমরা আলাদা করতে পারি। আপনারা ঠিক বলেছেন যে সেটে যদি কেবলমাত্র ন্যূনসুটি থাকে তবে আমরা সমস্ত ন্যূনাল মানগুলির এই সেটটি থেকে NULL সেটটি পার্থক্য করতে পারি না। আমার বক্তব্যটি এটি ছিল না যে এটি প্রতিটি ক্ষেত্রেই কার্যকর, কেবল এটি কার্যকর হতে পারে। যদি আমি SUMএকটি কলাম এবং শূন্য ফিরে পাই তবে আমি জানি যে আমাকে ফলাফল দেখাতে নূন্য সারিতে কমপক্ষে একটি ব্যবহার করা হচ্ছে না তা যাচাই করেই না করে।
লেইফ রিফেল

@ সাইপ্রুড - আপনি একেবারে সঠিক। আমার বক্তব্যটি হ'ল এসইএম-এর বর্তমান আচরণ একটি মান রয়েছে এমন একটি সেট থেকে একটি খালি সেটকে পৃথক করে (কিছু কিছু শূন্য হলেও)। এটি যখন ব্যবহার করার চেয়ে আলাদা করার প্রয়োজন হয় না তখনই COALESCE ব্যবহার করা সহজ DECODE(count(c2),0,NULL,sum(c2))
লেইফ রিফেল

-1

আমি যে প্রধান পার্থক্যটি দেখতে পাচ্ছি তা হ'ল ডেটাটাইপ সম্পর্কিত। COUNT এর একটি সুসংজ্ঞাযুক্ত রিটার্নটাইপ রয়েছে: পুরো সংখ্যা। অন্যরা সকলেই যে কলাম / অভিব্যক্তিটি তারা দেখছে তার উপর নির্ভর করে। তাদের রিটার্নের ধরনটি অবশ্যই সেটটির সমস্ত সদস্যের সাথে সামঞ্জস্যপূর্ণ হতে হবে (মনে করুন ফ্লোট, মুদ্রা, দশমিক, বিসিডি, টাইমস্প্যান, ...)। যেহেতু কোনও সেট নেই তাই আপনি কোনও রিটার্নের ধরণ বোঝাতে পারবেন না, সুতরাং নুল আপনার সেরা বিকল্প।

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


5
আমরা কেন একটি SUM(column)অভিব্যক্তিতে একটি রিটার্ন টাইপ বোঝাতে পারি না ? আমাদের কী খালি টেবিল নেই - এবং সেখানে সমস্ত কলামে সংজ্ঞায়িত প্রকার রয়েছে? খালি ফলাফলের সেটটির জন্য কেন এটি আলাদা হতে হবে?
ypercubeᵀᴹ

5
আপনি "যেখানে কোনও সেট নেই " যেহেতু আপনি বলছেন সেখানে ভুল হয়ে গেছে । একটি সেট আছে। জড়িত কলাম বা অভিব্যক্তির ঘোষিত ধরণের সমস্ত সম্ভাব্য মানের সেট। আপনি যে সারণীটি সন্ধান করছেন তা খালি থাকলেও এটি ঘোষিত প্রকারটি বিদ্যমান। এমনকি খালি টেবিলগুলির এখনও একটি শিরোনাম রয়েছে। এবং সেই ঘোষিত প্রকারটি হ'ল আপনার "অন্তর্নিহিত রিটার্নের ধরণ"।
এরউইন স্মাউট

আপনারা দুজনেই কি আমার নোটটি পড়েছেন? হ্যাঁ, এটি এখন পর্যন্ত কলাম ভিত্তিক এসএমএসের জন্য কাজ করবে। তবে আপনি যখনই কোনও ভেরিয়েবল ডেটাটাইপ-কলামের মুখোমুখি হোন (এসকিউএল সার্ভারে নেই - তবে) আপনার ভাগ্য নেই।
টিটোনি

2
এই ক্ষেত্রে আপনি যোগফল কীভাবে সংজ্ঞায়িত করবেন? ফলাফল কী হবে 24 + 56.07 + '2012-10-05' + 'Red'? আমি বোঝাতে চাইছি যে SUM()সংযোজন সংজ্ঞায়িত করতে আমাদের যখন সমস্যা হয় তখন কীভাবে আচরণ করবে তা নিয়ে চিন্তিত হওয়ার কোনও কারণ নেই ।
ypercubeᵀᴹ

1
@ টনি: "বিশেষত যখন আপনি আদর্শের সম্ভাব্য বিস্তৃতি সম্পর্কে ভাবেন" ওপিকে যে প্রসঙ্গে উল্লেখ করা হয়েছিল তা নয়। ওপি খুব স্পষ্টভাবে স্ট্যান্ডার্ডের বর্তমান সংস্করণটির কথা উল্লেখ করছিল, যার মধ্যে "গতিশীল প্রকার" বা এরকম কোনও ধারণার কোনও ধরণের অন্তর্ভুক্ত নেই। (ওহ, এবং আমি কেবল মন্তব্য করেছি, তবে ডাউনওয়েট করি নি that এই ছোট্ট স্লিপটি ছাড়াও আমি জবাব দিয়েছি, আপনার উত্তরের কোনও কিছুই ডাউনভোটের পরোয়ানা দেওয়ার পক্ষে যথেষ্ট ভুল ছিল না IM আইএমও।)
এরউইন স্মট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.