আমি ব্যবহার করে ক্যোয়ারী সমস্যার সমাধান করেছি ... row_number() over (partition by
... এটি কেন আমরা যোগদান করে নাল মান সহ কলামগুলি ব্যবহার করতে পারি না সে সম্পর্কে এটি আরও একটি সাধারণ প্রশ্ন। যোগদানের জন্য নাল কেন নলের সমান হতে পারে না?
আমি ব্যবহার করে ক্যোয়ারী সমস্যার সমাধান করেছি ... row_number() over (partition by
... এটি কেন আমরা যোগদান করে নাল মান সহ কলামগুলি ব্যবহার করতে পারি না সে সম্পর্কে এটি আরও একটি সাধারণ প্রশ্ন। যোগদানের জন্য নাল কেন নলের সমান হতে পারে না?
উত্তর:
যোগদানের জন্য নাল কেন নলের সমান হতে পারে না?
কেবল ওরাকলকে এটি করতে বলুন:
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)
বিকল্প হিসাবে আপনি 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
অপারেটর, এখনও ওরাকলে সমর্থিত নয়।
কেবল সম্পূর্ণতার জন্য আমি উল্লেখ করব যে ফাংশনটি 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)
সুবিধাটি হ'ল আপনি 'ম্যাজিক' নম্বর সমস্যাটি দেখতে পাচ্ছেন না।
ওরাকল ডক্সের রেফারেন্সটি বেসিক ম্যাটারিয়ালাইজড ভিউগুলিতে রয়েছে - ম্যাটারিয়ালাইজড ভিউগুলির জন্য সূচক নির্বাচন করা ।
ডিকোড ব্যবহার করে নাল মানগুলিতে যোগ দিতে পারেন:
on decode(t1.id, t2.id, 1, 0) = 1
decode
নালকে সমান হিসাবে বিবেচনা করে, সুতরাং এটি "যাদু" সংখ্যা ছাড়াই কাজ করে। দুটি কলামে একই ডেটা টাইপ থাকতে হবে।
এটি সর্বাধিক পঠনযোগ্য কোড তৈরি করবে না তবে সম্ভবত এখনও এর চেয়ে ভাল t1.id = t2.id or (t1.id is null and t2.id is null)
আপনি কেন যোগদান করে নাল মান ব্যবহার করতে পারবেন না? ওরাকলে, নিম্নলিখিত দু'টিই সত্য বলে মূল্যায়ন করে না:
NULL = NULL
NULL <> NULL
এটা কেন আমরা আছে IS NULL
/ IS NOT NULL
নাল মান পরীক্ষা করার জন্য।
এটি পরীক্ষা করার জন্য, আপনি সহজভাবে এটি করতে পারেন:
SELECT * FROM table_name WHERE NULL = NULL
যোগদানকারীরা একটি বুলিয়ান শর্তটি মূল্যায়ন করছে এবং তারা কোনও ভিন্নরূপে পরিচালনার জন্য তাদের প্রোগ্রাম করে নি। আপনি যোগদানের শর্তে একটি বৃহত্তর চিহ্ন রাখতে পারেন এবং অন্যান্য শর্ত যুক্ত করতে পারেন; এটি কেবল এটি বুলিয়ান এক্সপ্রেশন হিসাবে মূল্যায়ন করে।
আমি অনুমান করি যে ধারাবাহিকতার জন্য একটি নাল একটি শূন্যের সাথে মিলিত হতে পারে। এটি তুলনা অপারেটরের স্বাভাবিক আচরণকে অস্বীকার করবে।
NULL = anything
ফলাফল NULL
কারণ এসকিউএল স্ট্যান্ডার্ড তাই বলে। অভিব্যক্তিটি সত্য হলেই একটি সারি যোগদানের শর্তটি পূরণ করে।
বেশিরভাগ রিলেশনাল ডাটাবেসে একটি নাল মানকে অজানা হিসাবে বিবেচনা করা হয়। এটি সমস্ত এইচএক্স জিরোগুলির সাথে বিভ্রান্ত হওয়ার দরকার নেই। যদি কোনও কিছুতে নাল (অজানা) থাকে তবে আপনি এটি তুলনা করতে পারবেন না।
Unknown = Known False
Unknown = Unknown False
Unknown >= Known False
Known >= Unknown False
যার অর্থ, যে কোনও সময় আপনার বুলিয়ান এক্সপ্রেশনে অপারেন্ড হিসাবে নাল থাকে, অন্য অংশটি সর্বদা সত্য হবে।
বিকাশকারীদের দ্বারা নাল প্রতি সাধারণ ঘৃণার বিপরীতে নাল এর জায়গা আছে। যদি কিছু অজানা থাকে তবে নাল ব্যবহার করুন।
UNKNOWN
, না FALSE
;)
where (a = b or (a is null and b is null))
sys_op_map_nonnull