আমি কেন যোগদান করতে নাল মান ব্যবহার করতে পারি না?


13

আমি ব্যবহার করে ক্যোয়ারী সমস্যার সমাধান করেছি ... row_number() over (partition by... এটি কেন আমরা যোগদান করে নাল মান সহ কলামগুলি ব্যবহার করতে পারি না সে সম্পর্কে এটি আরও একটি সাধারণ প্রশ্ন। যোগদানের জন্য নাল কেন নলের সমান হতে পারে না?

উত্তর:


31

যোগদানের জন্য নাল কেন নলের সমান হতে পারে না?

কেবল ওরাকলকে এটি করতে বলুন:

select *
from one t1 
  join two t2 on coalesce(t1.id, -1) = coalesce(t2.id, -1);

(নোট করুন যে স্ট্যান্ডার্ড এসকিউএল এ আপনি t1.id is not distinct from t2.idনাল-নিরাপদ সমতা অপারেটরটি পেতে ব্যবহার করতে পারেন তবে ওরাকল এটি সমর্থন করে না)

তবে এটি কেবলমাত্র তখনই কাজ করবে যদি প্রতিস্থাপনের মান (উপরের উদাহরণে -1) আসলে টেবিলটিতে উপস্থিত না হয়। সংখ্যার জন্য এই জাতীয় "যাদু" মান খুঁজে পাওয়া সম্ভব হতে পারে তবে চরিত্রের মানগুলির পক্ষে এটি খুব কঠিন হবে (বিশেষত কারণ ওরাকল খালি স্ট্রিংয়ের nullসাথেও আচরণ করে)

প্লাস: idকলামগুলিতে কোনও সূচক ব্যবহার করা হবে না (আপনি এক্সপ্রেশন সহ কোনও ফাংশন ভিত্তিক সূচকটি সংজ্ঞায়িত করতে পারেনcoalesce() )।

ম্যাজিক মান ব্যতীত অন্য একটি বিকল্প যা সমস্ত ধরণের জন্য কাজ করে:

              on t1.id = t2.id or (t1.id is null and t2.id is null)

তবে আসল প্রশ্নটি: এটি কি কোনও অর্থবোধ করে?

নিম্নলিখিত নমুনা ডেটা বিবেচনা করুন:

টেবিল এক

id
----
1
2
(null)
(null)

টেবিল দুটি

id
----
1
2
(null)
(null)
(null)

যোগদানের ক্ষেত্রে নাল মানগুলির সংমিশ্রণের কোনটি বেছে নেওয়া উচিত? আমার উপরের উদাহরণের ফলে সমস্ত নাল মানগুলির জন্য ক্রস জোয়ারের মতো কিছু ঘটবে।

T1_ID  | T2_ID 
-------+-------
     1 |      1
     2 |      2
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)
(null) | (null)

6

বিকল্প হিসাবে আপনি INTERSECTসাম্য অপারেটর হিসাবে ব্যবহার করে দুটি নাল একে অপরের সাথে মেলে করতে পারেন :

SELECT
  *
FROM
  t1
  INNER JOIN t2
    ON EXISTS (SELECT t1.ID FROM DUAL INTERSECT SELECT t2.ID FROM DUAL)
;

একটি উদাহরণের জন্য এই ডিবিফিটাল ডেমোটি দেখুন ।

অবশ্যই এটি বেশ মুখের চেহারা দেখাচ্ছে যদিও এটি ব্রাইটস্পঞ্জের পরামর্শের চেয়ে আসলে বেশি দীর্ঘ নয় । তবে, এটি অবশ্যই কোনও মিল নয়, যদি আপনি পুণ্য ক্ষমা করেন, তবে মন্তব্যগুলির স্ট্যান্ডার্ড উপায়ে মন্তব্যটির দৃis়তার সাথে, যা IS NOT DISTINCT FROMঅপারেটর, এখনও ওরাকলে সমর্থিত নয়।


2

কেবল সম্পূর্ণতার জন্য আমি উল্লেখ করব যে ফাংশনটি SYS_OP_MAP_NONNULLএখন নিরাপদে মানগুলির সাথে তুলনা করতে নিরাপদে ব্যবহার করা যেতে পারে কারণ এটি এখন 12 সি ডকুমেন্টেশনে নথিভুক্ত রয়েছে। এর অর্থ ওরাকল এলোমেলোভাবে এটিকে সরাবে না এবং আপনার কোডটি ভঙ্গ করবে।

SELECT *
FROM   one t1 
       JOIN two t2
         ON SYS_OP_MAP_NONNULL(t1.id) = SYS_OP_MAP_NONNULL(t2.id)

সুবিধাটি হ'ল আপনি 'ম্যাজিক' নম্বর সমস্যাটি দেখতে পাচ্ছেন না।

ওরাকল ডক্সের রেফারেন্সটি বেসিক ম্যাটারিয়ালাইজড ভিউগুলিতে রয়েছে - ম্যাটারিয়ালাইজড ভিউগুলির জন্য সূচক নির্বাচন করা


তাহলে এখন তা নথিভুক্ত? কারণ অ্যাসটম (২০০৩ সালে) বলেছিলেন: " - এটিwhere (a = b or (a is null and b is null))sys_op_map_nonnull
ypercubeᵀᴹ

আপনার যদি লিঙ্ক থাকে তবে দয়া করে এটি প্রশ্নের সাথে যুক্ত করুন। আমি 12 সি ফাংশনগুলিতে উল্লেখ পাইনি তবে ওরাকল ডকুমেন্টেশন এবং নির্দিষ্ট সংস্করণ অনুসন্ধান করা বরং কঠিন is
ypercubeᵀᴹ

2

ডিকোড ব্যবহার করে নাল মানগুলিতে যোগ দিতে পারেন:

on decode(t1.id, t2.id, 1, 0) = 1

decodeনালকে সমান হিসাবে বিবেচনা করে, সুতরাং এটি "যাদু" সংখ্যা ছাড়াই কাজ করে। দুটি কলামে একই ডেটা টাইপ থাকতে হবে।

এটি সর্বাধিক পঠনযোগ্য কোড তৈরি করবে না তবে সম্ভবত এখনও এর চেয়ে ভাল t1.id = t2.id or (t1.id is null and t2.id is null)


1

আপনি কেন যোগদান করে নাল মান ব্যবহার করতে পারবেন না? ওরাকলে, নিম্নলিখিত দু'টিই সত্য বলে মূল্যায়ন করে না:

  • NULL = NULL
  • NULL <> NULL

এটা কেন আমরা আছে IS NULL/ IS NOT NULLনাল মান পরীক্ষা করার জন্য।
এটি পরীক্ষা করার জন্য, আপনি সহজভাবে এটি করতে পারেন:

SELECT * FROM table_name WHERE NULL = NULL

যোগদানকারীরা একটি বুলিয়ান শর্তটি মূল্যায়ন করছে এবং তারা কোনও ভিন্নরূপে পরিচালনার জন্য তাদের প্রোগ্রাম করে নি। আপনি যোগদানের শর্তে একটি বৃহত্তর চিহ্ন রাখতে পারেন এবং অন্যান্য শর্ত যুক্ত করতে পারেন; এটি কেবল এটি বুলিয়ান এক্সপ্রেশন হিসাবে মূল্যায়ন করে।

আমি অনুমান করি যে ধারাবাহিকতার জন্য একটি নাল একটি শূন্যের সাথে মিলিত হতে পারে। এটি তুলনা অপারেটরের স্বাভাবিক আচরণকে অস্বীকার করবে।


NULL = anythingফলাফল NULLকারণ এসকিউএল স্ট্যান্ডার্ড তাই বলে। অভিব্যক্তিটি সত্য হলেই একটি সারি যোগদানের শর্তটি পূরণ করে।
লরেনজ আলবে

1
আক্ষরিক বাস্তবায়ন বিশতির বাইরে (যা সর্বদা ক্ষেত্রে হয় না: কিছু ডিবি-তে NUL কে কিছু / সমস্ত উদ্দেশ্যে সমান করার বিকল্প থাকে) একটি যৌক্তিক কারণ রয়েছে: নূল অজানা। আপনি যখন NUL এর সাথে NUL এর তুলনা করেন আপনি জিজ্ঞাসা করছেন "এটি কি এই অজানা জিনিসটি এই অন্য অজানা জিনিসের সমান" যার একমাত্র যুক্তিসঙ্গত উত্তরটি "অজানা" - অন্য একটি NULL (যা তুলনার পরিস্থিতিতে মিথ্যাতে ম্যাপ করা হয়েছে)।
ডেভিড স্পিললেট

-4

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

Unknown = Known False
Unknown = Unknown False
Unknown >= Known False
Known >= Unknown False

যার অর্থ, যে কোনও সময় আপনার বুলিয়ান এক্সপ্রেশনে অপারেন্ড হিসাবে নাল থাকে, অন্য অংশটি সর্বদা সত্য হবে।

বিকাশকারীদের দ্বারা নাল প্রতি সাধারণ ঘৃণার বিপরীতে নাল এর জায়গা আছে। যদি কিছু অজানা থাকে তবে নাল ব্যবহার করুন।


6
আসলে আপনার কাছে সমস্ত উদাহরণের তুলনা, ফলন UNKNOWN, না FALSE;)
ypercubeᵀᴹ

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