এলএনএনভিএল জাস্টিফিকেশন


12

এলএনএনভিএল হ'ল ফাংশনটিতে নির্মিত একটি অরাকল যা মিথ্যা বা অজানা অবস্থায় মূল্যায়ন করার শর্তের জন্য সত্য প্রত্যাবর্তন করে এবং সত্যকে মূল্যায়ন করার শর্তে মিথ্যা প্রদান করে। আমার প্রশ্ন হ'ল কেবল শুল্কের মানগুলি হ্যান্ডেল না করে সত্যের অবস্থার বিপরীতে ফিরে আসার কী লাভ হবে?

উদাহরণস্বরূপ, ধরুন আপনার কাছে স্টার্টকমিশন এবং কারেন্টকমিশন কলামগুলির সাথে একটি এমপ টেবিল রয়েছে যাতে শূন্যগুলি থাকতে পারে। নিম্নলিখিত মানগুলি নালীর সাথে কেবল সারিগুলি দেয়:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission;

আপনি যদি সারিগুলি অন্তর্ভুক্ত করতে চেয়েছিলেন যেখানে উভয়ই কমিশন নাল হয় আপনি এই জাতীয় কিছু করতে পারেন:

SELECT * FROM Emp WHERE StartCommission = CurrentCommission 
OR StartCommission IS NULL OR CurrentCommission IS NULL;

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

SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);

এতে যোগ না করা কেবল শালীন ছাড়াই সারি দেয়। আমার কাছে মনে হয় যে এই মামলার পছন্দসই কার্যকারিতা হ'ল সত্য শর্তগুলি সত্য, মিথ্যা শর্তগুলি মিথ্যা রাখা এবং অজানা শর্তগুলি সত্যের কাছে মূল্যায়ন করা। আমি কি এখানে সত্যিই কম ব্যবহারের কেস তৈরি করেছি? সত্যই কি অজানাটিকে সত্যে, সত্যকে মিথ্যে এবং মিথ্যেকে সত্যে রূপান্তরিত করা কি আরও বেশি সম্ভাবনাযুক্ত?

create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2));
insert into emp values (null,null);
insert into emp values (null,.1);
insert into emp values (.2,null);
insert into emp values (.3,.4);

আজ আমি এলএনএনভিএলের সাথে সাক্ষাত করেছি এবং আমি এই অংশটি "সত্যের বিপরীতে ফিরে আসার সুবিধা কী হবে" তা জানতে বা বোঝার চেষ্টা করছি। তবে, আপনি এলএনএনভিএলকে উদাহরণ দেওয়ার জন্য যে বিবৃতিটি ব্যবহার করছেন তাতে না সমান অপারেটরটি ব্যবহার করা উচিত: যেখানে এলএনএনভিএল থেকে স্টার্ট * নির্বাচন করুন (স্টার্টকমিশন <> কারেন্টকমিশন); যাতে এটি ওআরএস ব্যবহার করে বিবৃতি হিসাবে একই ফলাফল দেয়। অন্য কথায়, যদি আমরা একটি শর্ত ব্যবহার করি এবং আমরা NULL মান সম্পন্ন সারিগুলিও অন্তর্ভুক্ত করতে চাই, আমাদের অবস্থার অবহেলা LNNVL এ পাস করতে হবে।
কেবল আপনি

আর একটি সহজ উদাহরণ। কেবলমাত্র এমন কর্মচারী যারা প্রকৃতপক্ষে 20% এরও কম কমিশন পান: কমিশন_প্যাক্ট <.2; কোনও কমিশন পান না এমন কর্মচারীদেরও অন্তর্ভুক্ত করতে: যেখানে এলএনএনভিএল (কমিশন_প্যাক্ট> = .2) থেকে * নির্বাচন করুন;
আপনি কেবল

@ কেবলমাত্র আপনি - আপনি সঠিক, এলএনএনভিএলকে একই কাজ করতে শর্তটি <> হতে হবে। আমি এটি আরও = রেখেছি কারণ যদি ফাংশনটি = চিহ্ন দিয়ে একই ফলাফল দেয় তবে এটি আরও অর্থবোধ করবে। মূলত ফাংশনটি দুটি ক্রিয়া সম্পাদন করে থাকে 1. নাল অন্তর্ভুক্তি, ২. বুলিয়ান টগল। প্রাক্তনটি বোঝায়, পরে কেবল পছন্দসই শর্তের বিপরীতে প্রয়োজনীয় জিনিসগুলিকে বিভ্রান্ত করে। যেমন = প্রয়োজন <>, <প্রয়োজন> = ইত্যাদি,
লেইফ রিফেল

উত্তর:


6

এটি একটি অদ্ভুত ইতিহাস সহ একটি অদ্ভুত ফাংশন - তবে তারপরে এনভিএল 2 অদ্ভুত। lnnvlমূলত is not trueঅপারেটর - কোনও সন্দেহ নেই যে এটির মতো ভাল ব্যবহার করা যেতে পারে nvl2তবে আপনি যখন যা করেন ঠিক তখনই আপনাকে এটি স্মরণ করিয়ে দেওয়ার জন্য যখন কোনও ফাংশন সন্ধান করতে হয়, আপনি অবাক হয়ে ভাবছেন যে এটি স্থির থাকা ভাল if nvl, coalesce, decodeএবং nullifসহ caseযা আরও বেশি ধারণাসম্পন্ন হয় এক্সপ্রেশন,


আমি এনভিএল 2 অদ্ভুত খুঁজে পাই না, তবে তারপরে আমি এটি প্রচুর ব্যবহার করি এবং আমি কখনই এলএনএনভিএল ব্যবহার করি না।
লেইফ রিফেল

@ লেইহ - আমি অনুমান করি যে এটি অদ্ভুত না হয়ে যাওয়ার জন্য আপনাকে এটি প্রায়শই যথেষ্ট পরিমাণে ব্যবহার করতে হবে :) আমি কখনই ব্যবহার করি না nullifযতক্ষণ না বুঝতে পারি যে এটি 'শূন্য দ্বারা বিভাজন' তৈরিতে দুর্দান্ত সাহায্য হতে পারে = শুন্য। আপনি কি সত্যিকার অর্থে এনভিএল 2 (ক, সি, বি) ডিকোডের (a, নাল, বি, সি) এর চেয়ে অনেক ভাল পেয়েছেন?
জ্যাক বলছেন topanswers.xyz

4

এটি এইভাবে রাখুন, আমি ডিবিএ এবং পিএল / এসকিউএল প্রোগ্রামার হওয়ার কয়েক বছর ধরে আমি এখনও একবারে এলএনএনভিএল ব্যবহার করি নি। আমি উপলক্ষে এনভিএল 2 ব্যবহার করেছি (এবং সর্বদা অনুসন্ধান করা উচিত কোন দিকটি সত্য ছিল, এবং কোন পক্ষটি ছিল না)। এই মুহুর্তে, NVL, DECODE, CASE ইত্যাদির সাহায্যে শেষ পর্যন্ত পাঠযোগ্যতার দৃষ্টিকোণ থেকে এটি আরও ভাল seems

বিকল্পভাবে, এটি কাজ করে ধরে নিচ্ছে যে ওরাকল কীভাবে NULL এবং পাটিগণিত পরিচালনা করে তার একটি ভাল হ্যান্ডেল রয়েছে তবে এই মুহুর্তে, কেউ আপনার মূল প্রশ্নটি পাঠযোগ্যতার জন্য ব্যবহার করতে পারে (এবং কার্যকর করার পরিকল্পনাটি আরও কঠোর হতে পারে):

/* Return all rows where StartCommission is the same
 * as Current Commission, or those rows who have a
 * NULL in either (including both)
 */

SELECT *
  FROM Emp
 WHERE StartCommission = CurrentCommission
    OR StartCommission + CurrentCommission IS NULL

-- NULL + NULL, or NULL + Number is always NULL; hence return either
-- those records that are equal, or have a combined total of NULL
-- (either or both fields will be NULL).

মানে StartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULL?
জ্যাক বলছেন topanswers.xyz

@ জ্যাকপিডুগ্লাস - এটি = হিসাবে অর্থবোধ করে।
লেইফ রিফেল

আকর্ষণীয় প্রকরণ। আমি আপনার সিদ্ধান্তে একমত।
লেইফ রিফেল

@ লেইহ - আমি দেখছি যে ফাংশনটি আপনি চান তার বিকল্প নয়, এর বিকল্প নয় lnnvl
জ্যাক বলছেন topanswers.xyz

@ জ্যাকপিডুগ্লাস - আমি বুঝতে পেরেছি এবং আমি মনে করি কেরির উদ্দেশ্য এটিই ছিল।
লেইফ রিফেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.