অপারেটর
এটি @ ড্যানিয়েলের চালাক অপারেটরটির উপর নির্মাণ করছে ।
এটিতে থাকাকালীন পলিমারফিক প্রকারগুলি ব্যবহার করে ফাংশন / অপারেটর কম্বো তৈরি করুন । তারপরে এটি যে কোনও প্রকারের জন্য কাজ করে - ঠিক যেমন কনস্ট্রাক্ট।
এবং ফাংশন করা IMMUTABLE
।
CREATE FUNCTION is_distinct_from(anyelement, anyelement)
RETURNS bool LANGUAGE sql IMMUTABLE AS
'SELECT $1 IS DISTINCT FROM $2';
CREATE OPERATOR <!> (
PROCEDURE = is_distinct_from(anyelement,anyelement),
LEFTARG = anyelement
, RIGHTARG = anyelement
);
সিম্বহাউন্ড সহ একটি দ্রুত অনুসন্ধান খালি এসেছিল, তাই অপারেটরটি মডিউলগুলির কোনওরূপে<!>
ব্যবহৃত হবে বলে মনে হয় না।
আপনি যদি এই অপারেটরটিকে প্রচুর পরিমাণে ব্যবহার করতে চলেছেন তবে ক্যোয়ারী পরিকল্পনাকারীকে সহায়তা করার জন্য আপনি আরও কিছু বেরিয়ে যেতে পারেন ( যেমন কোনও মন্তব্যে প্রস্তাবিত হারিয়ে যাওয়া )। প্রারম্ভিকদের জন্য, আপনি ক্যোয়ারী অপ্টিমাইজারকে সহায়তা করার জন্য ক্লজ COMMUTATOR
এবং NEGATOR
ক্লজগুলি যুক্ত করতে পারেন। CREATE OPERATOR
উপরে এটির সাথে প্রতিস্থাপন করুন :
CREATE OPERATOR <!> (
PROCEDURE = is_distinct_from(anyelement,anyelement),
LEFTARG = anyelement
, RIGHTARG = anyelement
, COMMUTATOR = <!>
, NEGATOR = =!=
);
এবং যোগ কর:
CREATE FUNCTION is_not_distinct_from(anyelement, anyelement)
RETURNS bool LANGUAGE sql IMMUTABLE AS
'SELECT $1 IS NOT DISTINCT FROM $2';
CREATE OPERATOR =!= (
PROCEDURE = is_not_distinct_from(anyelement,anyelement),
LEFTARG = anyelement
, RIGHTARG = anyelement
, COMMUTATOR = =!=
, NEGATOR = <!>
);
তবে অতিরিক্ত ধারাগুলি হাতের ব্যবহারের ক্ষেত্রে সহায়তা করবে না এবং সরল সূচকগুলি এখনও ব্যবহার করা হবে না। এটি অর্জন করা অনেক বেশি পরিশীলিত। (আমি চেষ্টা করিনি।) বিশদটির জন্য ম্যানুয়ালটিতে "অপারেটর অপটিমাইজেশন তথ্য" অধ্যায়টি পড়ুন ।
পরীক্ষা ক্ষেত্রে
অ্যারেতে সমস্ত মান একরকম হলেই প্রশ্নে পরীক্ষার কেস সফল হতে পারে। প্রশ্নে অ্যারের জন্য ( '{null,A}'::text[]
) ফলাফল সর্বদা সত্য। এটা কি উদ্দেশ্য? আমি "সকলের থেকে ডায়াস্টিন্ট" এর জন্য আরও একটি পরীক্ষা যুক্ত করেছি:
SELECT foo
, foo <!> ANY ('{null,A}'::text[]) AS chk_any
, foo <!> ALL ('{null,A}'::text[]) AS chk_all
FROM (
VALUES ('A'),('Z'),(NULL)
) z(foo)
foo | chk_any | chk_all
-----+---------+---------
A | t | f
Z | t | t
| t | f
স্ট্যান্ডার্ড অপারেটরগুলির সাথে বিকল্প
foo IS DISTINCT FROM ANY (test_arr) -- illegal syntax
করতে প্রায় থেকে অনুবাদ করা
foo = ALL (test_arr) IS NOT TRUE
foo = ALL (test_arr)
উৎপাদনের ...
TRUE
.. যদি সমস্ত উপাদান হয় foo
FALSE
.. যদি কোনও NOT NULL
উপাদান হয় <> foo
NULL
.. যদি কমপক্ষে একটি উপাদান থাকে IS NULL
এবং কোনও উপাদান হয় না<> foo
সুতরাং, বাকি কোণার কেসটি কোথায়
- foo IS NULL
- এবং উপাদানগুলি test_arr
ব্যতীত কিছুই থাকে না NULL
।
উভয়কেই যদি উড়িয়ে দেওয়া যায় তবে আমাদের কাজ শেষ। সুতরাং, সাধারণ পরীক্ষাটি ব্যবহার করুন যদি
- কলামটি সংজ্ঞায়িত হয় NOT NULL
।
- বা আপনি জানেন অ্যারে সব ন্যূনসুটি হয় না।
অন্য, অতিরিক্ত পরীক্ষা:
AND ('A' = ALL(test_arr) IS NOT NULL OR
'B' = ALL(test_arr) IS NOT NULL OR
foo IS NOT NULL)
যেখানে 'A'
এবং 'B'
যে কোনও স্বতন্ত্র মান হতে পারে । এসও সম্পর্কিত এই সম্পর্কিত প্রশ্নের অধীনে ব্যাখ্যা এবং বিকল্পগুলি:
পোস্টগ্রাইএসকিউএল-এ সমস্ত নূরে রয়েছে
আবার, যদি আপনি এমন কোনও মান সম্পর্কে জানেন যা বিদ্যমান থাকতে পারে না test_arr
, উদাহরণস্বরূপ খালি স্ট্রিংটি ''
, আপনি এখনও সহজ করতে পারেন:
AND ('' = ALL(test_arr) IS NOT NULL OR
foo IS NOT NULL)
সমস্ত সংমিশ্রণের জন্য পরীক্ষা করার জন্য এখানে একটি সম্পূর্ণ টেস্ট ম্যাট্রিক্স:
SELECT foo, test_arr
, foo = ALL(test_arr) IS NOT TRUE AS test_simple
, foo = ALL(test_arr) IS NOT TRUE
AND ('A' = ALL(test_arr) IS NOT NULL OR
'B' = ALL(test_arr) IS NOT NULL OR
foo IS NOT NULL) AS test_sure
FROM (
VALUES ('A'),('Z'),(NULL)
) v(foo)
CROSS JOIN (
VALUES ('{null,A}'::text[]),('{A,A}'),('{null,null}')
) t(test_arr)
foo | test_arr | test_simple | test_sure
-----+-------------+-------------+-----------
A | {NULL,A} | t | t
A | {A,A} | f | f -- only TRUE case
A | {NULL,NULL} | t | t
Z | {NULL,A} | t | t
Z | {A,A} | t | t
Z | {NULL,NULL} | t | t
| {NULL,A} | t | t
| {A,A} | t | t
| {NULL,NULL} | t | f -- special case
এটি অ্যান্ড্রির EXCEPT
সমাধানের চেয়ে কিছুটা ভারবস , তবে এটি যথেষ্ট দ্রুত।