টিএসকিউএলে কোলেসেস ফাংশন


109

কেউ কী ব্যাখ্যা করতে পারে যে টিএসকিউএল-এ COALESCE কীভাবে কাজ করে? বাক্য গঠনটি নিম্নরূপ

সংযোগ (x, y)

এই ফাংশনটির এমএসডিএন ডকুমেন্টটি বেশ অস্পষ্ট

উত্তর:


74

আমাকে বলা হয়েছে যে COALESCE ISNULL এর চেয়ে কম ব্যয়বহুল, তবে গবেষণা এটি নির্দেশ করে না। আইএসএনএলএল কেবলমাত্র দুটি পরামিতি নেয়, ক্ষেত্রটি ন্যূনুএলএল জন্য মূল্যায়ন করা হচ্ছে, এবং ফলাফলটি যদি এটি নুল হিসাবে মূল্যায়ন করা হয় তবে আপনি চান। COALESCE যে কোনও প্যারামিটারের সংখ্যা নেবে এবং প্রথম মানটি যেটি শূন্য নয় তা ফিরিয়ে দেবে।

সেখানে বিস্তারিত অনেক পুঙ্খানুপুঙ্খ বর্ণনা আছে এখানে http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/


6
ব্যবহারের বিষয়ে সতর্ক থাকুন ISNULL, এটি স্ট্যান্ডার্ড নয়, কম নমনীয়, আমি পড়েছি যে এটি সর্বদা প্রথম আর্গুমেন্টের ডেটাটাইপকে ফিরিয়ে দেবে এবং প্রত্যাবর্তিত মানটির মতো ডেটাটাইপকে নয় COALESCE
স্প্রোকট 12

215

আপনি কেন ডকুমেন্টেশনটি অস্পষ্ট বলে মনে করেন তা নিশ্চিত।

এটি কেবল এক এক করে সমস্ত পরামিতিগুলির মধ্য দিয়ে যায় এবং এটি প্রথমটি ফিরে আসে NOT NULL

COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1


COALESCE(1, 2, 3, 4, 5, NULL)
=> 1


COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3


COALESCE(6, 5, 4, 3, 2, NULL)
=> 6


COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL

এটি বেশ কয়েকটি সংখ্যক পরামিতি গ্রহণ করে, তবে সেগুলি একই ডেটা-টাইপের হওয়া উচিত। (তারা একই ডেটা-টাইপ না হন, তাহলে তারা পরোক্ষভাবে একটি যথাযথ তথ্য-টাইপ ব্যবহার কাস্ট পেতে প্রাধান্য ডাটা-টাইপ অর্ডার ।)

এটি ISNULL()কেবল দুটি নয় বরং একাধিক পরামিতির জন্য।

এটিও ANSI-SQL, যেখানে ISNULL()নেই তেমন।


4
+1 ডেটা ধরণের অগ্রাধিকার সম্পর্কে আপনার ব্যাখ্যার জন্য। আমি বিশ্বাস করি যে ISNULLপ্রথম প্যারামিটারের মতো একই ডেটাটাইপের সাহায্যে কোনও মান ফেরত আসে
লামাক

5
আপনার শেষ কোড উদাহরণটিতে ত্রুটিটি দেওয়া উচিত 'COALESCE এর কাছে কমপক্ষে একটি যুক্তি অবশ্যই একটি টাইপড নুয়াল
maqk

2
প্রায় শূন্য মান সরবরাহ করার জন্য ডকুমেন্টেশনটি অনেক কিছু বলে। ভাল ডক্স একটি সাধারণ ফলাফল সহ একটি সাধারণ উদাহরণ সরবরাহ করে। কোলেসেস তত্ক্ষণাত সরে যায় expressions, CASE এর সাথে তুলনা করে, ISNULL এর সাথে তুলনা করে এবং শেষ পর্যন্ত কোনও ফলাফল ছাড়াই একটি উদাহরণ। তারপরে অনেকগুলি বিশদ সহ একটি অতি জটিল উদাহরণ। আমাদের যখন প্রয়োজন কেবল তখনই এই উত্তরটি ডাব্লুটিএফের 5 - 6 লাইনের সাথে এই জিনিসটি হয় এবং হয়।
পি.ব্রেইন.ম্যাকি


18

এখানে আমি COALESCE এ দেখছি ... এবং আশা করি এটি বোধগম্য হয় ...

সরল আকারে…।

কোলেসেস (ফিল্ডনাম, 'খালি')

সুতরাং এটি অনুবাদ করে… যদি "ফিল্ডনাম" নুল হয় তবে "EMPTY" শব্দটি সহ ক্ষেত্রের মানকে বিশিষ্ট করুন।

মাল্টিপল মানগুলির জন্য এখন ...

কোলেসেস (ফিল্ডনাম 1, ফিল্ডনাম 2, মান 2, মান 3)

ক্ষেত্রের নাম 1 এর মানটি যদি শূন্য হয় তবে ফিল্ডের নাম 2 এ মানটি পূরণ করুন, যদি FieldName2 NULL হয় তবে এটি মান 2 সহ পূরণ করুন etc.

অ্যাডভেঞ্চার ওয়ার্কস ২০১২ স্যাম্পল ডাটাবেসের জন্য পরীক্ষার কোডের এই অংশটি নিখুঁতভাবে কাজ করে এবং COALESCE কীভাবে কাজ করে তার একটি ভিজ্যুয়াল ব্যাখ্যা দেয় :

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product

4

আইএসএনএলএল-র প্রতিস্থাপনের চেয়ে আরও অনেক কিছু মিল রয়েছে। আমি সম্পূর্ণরূপে সম্মত হই যে Coalesce এর অফিসিয়াল "ডকুমেন্টেশন" অস্পষ্ট এবং অসহায়। এই নিবন্ধটি অনেক সাহায্য করে। http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/


3
আপনি যে নিবন্ধটি লিঙ্ক করেছেন তা অত্যন্ত বিভ্রান্তিমূলক (যেমন মন্তব্য বিভাগে লেখক সহ বেশ কয়েকটি ব্যক্তি চিহ্নিত করেছেন)। সমস্ত ঝরঝরে কৌতুকগুলি তিনি হাইলাইট করেছেন যা কোয়েলসেসের জায়গায় সমস্ত ব্যবহার করা যেতে পারে।
হাবো স্পাইডার

3

এখানে কোলেসিস সহ একটি সাধারণ প্রশ্ন রয়েছে -

select * from person where coalesce(addressId, ContactId) is null.

এটি সেই ব্যক্তিকে ফিরিয়ে দেবে যেখানে ঠিকানা ঠিকানা এবং যোগাযোগের আইডি উভয়ই বাতিল are

coalesce ফাংশন

  • কমপক্ষে দুটি যুক্তি লাগে।
  • তর্কগুলি অবশ্যই পূর্ণসংখ্যার ধরণের হতে হবে।
  • প্রথম অ-নাল যুক্তিটি ফিরিয়ে দিন।

যেমন

  • coalesce (নাল, 1, 2, 3) ফিরে আসবে 1।
  • coalesce (নাল, নাল) নাল ফিরে আসবে।

1

কোলেসেস () ফাংশনের সর্বাধিক সংজ্ঞা হতে পারে:

কোলেসেস () ফাংশনটি সমস্ত পাস হওয়া আর্গুমেন্টের মূল্যায়ন করে তারপরে কোনও এনইউএলকে মূল্যায়ন না করে যুক্তির প্রথম উদাহরণটির মান প্রদান করে।

দ্রষ্টব্য: এটি সমস্ত পরামিতিগুলি মূল্যায়ন করে, অর্থাত্ প্রত্যাবর্তিত / নয় ন্যূন প্যারামিটারের ডানদিকে যুক্তির (গুলি) মূল্যায়ন এড়িয়ে যায় না।

বাক্য গঠন:

Coalesce(arg1, arg2, argN...)

সাবধানতা : নালকে যা মূল্যায়ন করে সেগুলি ছাড়াও অন্যান্য সমস্ত (নন-নুল) আর্গুমেন্টগুলি অবশ্যই একই ডেটাটাইপের হতে হবে বা মেলানো টাইপের হতে হবে (যা "সুস্পষ্টভাবে স্বয়ংক্রিয়ভাবে রূপান্তরিত হতে পারে" উপযুক্ত একটি ডেটাটাইপে রূপান্তরিত), উদাহরণগুলি দেখুন নিচে:

PRINT COALESCE(NULL, ('str-'+'1'), 'x')  --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3)    --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99)      --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.

DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31')  --returns today's date, works fine as implicit conversion into DATE type occurs.

--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str')      --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.

--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.

আছে HTH


0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str

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