এসকিউএল সার্ভার CASE বিবৃতিটি সমস্ত শর্তের মূল্যায়ন করে বা প্রথম সত্য শর্তে প্রস্থান করে?


44

এসকিউএল সার্ভার (২০০৮ বা ২০১২, বিশেষত) CASEবিবৃতিটি সমস্ত WHENশর্তের মূল্যায়ন করে বা যখন এটি এমন কোনও WHENধারা পেয়ে যায় যা সত্যকে মূল্যায়ন করে? যদি এটি পুরো শর্তের মধ্য দিয়ে যায় তবে তার মানে কি সত্যের কাছে মূল্যায়ন করা শেষ শর্তটি সত্যটির কাছে মূল্যায়ন করা প্রথম শর্তটি কী করে? উদাহরণ স্বরূপ:

SELECT
    CASE
        WHEN 1+1 = 2 THEN'YES'
        WHEN 1+1 = 3 THEN 'NO'
        WHEN 1+1 = 2 THEN 'NO' 
    END

ফলাফলগুলি "হ্যাঁ" যদিও শেষের শর্তটিকে "NO" এ মূল্যায়ন করা উচিত। দেখে মনে হচ্ছে এটি প্রথম সত্য শর্তটি খুঁজে পাওয়ার পরে এটি প্রস্থান করে। কেউ দয়া করে নিশ্চিত করুন যাবে যদি এই হল ক্ষেত্রে


5
খুব ঘনিষ্ঠভাবে সম্পর্কিত: এসকিউএল সার্ভারটি প্রথম যুক্তিটি নাল নয়, এমনকি কি একটি সমস্ত কল ফাংশন পড়ে? (যেমনটি COALESCE()একটি CASEঅভিব্যক্তিতে অনুবাদ হয়েছে ))
ypercubeᵀᴹ

উত্তর:


46

Input প্রথম ইনপুট_প্রকাশের ফলাফল_প্রকাশ = কখন_আমাপ্যটি সত্যকে মূল্যায়ণ করে

রেফারেন্স http: //msdn.mic Microsoft.com/en-us/library/ms181765.aspx


এটি স্ট্যান্ডার্ড এসকিউএল আচরণ:

  • একটি CASEঅভিব্যক্তি প্রথম সত্য শর্তটি মূল্যায়ন করে।

  • যদি সত্যিকারের শর্ত না থাকে তবে এটি ELSEঅংশটি মূল্যায়ন করে ।

  • যদি সত্যিকারের শর্ত না থাকে এবং ELSEঅংশ না থাকে তবে তা মূল্যায়ন করে NULL


2
আমি কেবল এটি নিশ্চিত করে তুলতে চেয়েছিলাম যে যদি আমার 3 টি ক্ষেত্রে শর্ত থাকে যা সমস্ত সত্যের কাছে মূল্যায়ন করে তবে আমি কেবল প্রথমটির কাজটিই করতে চাই যা সত্যকে মূল্যায়ন করা হয় এবং অপর 2 না (যদিও তারা সত্যকেও মূল্যায়ন করে তবে )। আমার প্রশ্নের উদাহরণ কোয়েরি থেকে এটি মনে হয়। আমি শুধু নিশ্চিত করতে চেয়েছিলাম আমি আরও আশা করছিলাম যে এসকিউএল শীর্ষ থেকে নীচে সিএসএসির শর্তগুলি পড়ে। ধন্যবাদ!
জুয়ান ভেলিজ

15

এসকিউএল সার্ভার সাধারণত CASE বিবৃতিগুলির জন্য শর্ট সার্কিট মূল্যায়ন করে ( এসকিউএলফিডাল ):

--Does not fail on the divide by zero.
SELECT 
   CASE 
      WHEN 1/1 = 1 THEN 'Case 1'
      WHEN 2/0 = 1 THEN 'Case 2'
   END;

--Fails on the divide by zero.
SELECT 
   CASE 
      WHEN 1/1 = 99 THEN 'Case 1'
      WHEN 2/0 = 99 THEN 'Case 2'
   END;  

এসকিউএল সার্ভার ২০১২-তে সঠিকভাবে শর্ট সার্কিট দেয় না এমন বিভিন্ন ধরণের বক্তব্য রয়েছে। মন্তব্যগুলিতে ইয়পারক्यूब থেকে লিঙ্কটি দেখুন।

ওরাকল সর্বদা শর্ট সার্কিট মূল্যায়ন করে । দেখুন 11.2 এসকিউএল ভাষা রেফারেন্স । বা নিম্নলিখিত ( এসকিউএলফিডাল ) তুলনা করুন :

--Does not fail on the divide by zero.
SELECT
  CASE 
    WHEN 1/1 = 1 THEN 'Case 1'
    WHEN 2/0 = 1 THEN 'Case 2'
  END
FROM dual;


--Fails on the divide by zero.
SELECT
  CASE 
    WHEN 1/1 = 99 THEN 'Case 1'
    WHEN 2/0 = 99 THEN 'Case 2'
  END
FROM dual;

এই একই পরীক্ষা মাইএসকিউএল দিয়ে করা যায় না কারণ এটি শূন্য দ্বারা বিভাগের জন্য NULL প্রদান করে। ( এসকিউএল ফিডল )


এটি সম্পর্কে কীভাবে ?: এসকিউএল-ফিডল
ypercube

1
ভাজাটি এসকিউএল-সার্ভার সম্পর্কে । এটি এখানে হারুনের উত্তর: এসকিউএল সার্ভার কি প্রথম যুক্তিটি নাল নয় এমনকি যদি একটি কলের সব কার্যকরী পাঠ করে?
ypercubeᵀᴹ

@ টাইপ्यूब এটি সত্যিই আকর্ষণীয় আচরণ behavior এটি কোডটি যা অন্য অংশে চলবে তা মূল্যায়ন করছে, তবে অন্যান্য WHEN এক্সপ্রেশনগুলি কী আছে এবং শূন্য দ্বারা বিভাজনটি একটি MIN এর ভিতরে রয়েছে কিনা তার উপর নির্ভর করে এটিকে এড়িয়ে চলেছে। দেখুন স্ক্লাফিল্ড.com
লেইফ রিফেল

@ টাইপ्यूब এখন আপনার পোস্ট করা লিঙ্কটির কিছু আমি পড়েছি, আপনি কি বলবেন যে এসকিউএল সার্ভার শর্ট সার্কিট মূল্যায়ন করে কিনা তার উত্তর - সাধারণত?
লেইফ রিফেল

3
হ্যাঁ, আমি "সাধারণত" একমত হই হারুন তার উত্তরে উল্লেখ করার সাথে সাথে একটি পরীক্ষা "সিএএসই সর্বদা শর্ট সার্কিট" অস্বীকার করার জন্য যথেষ্ট। তবে এটি সাধারণত হয়।
ypercubeᵀᴹ

7

এটি এমএস এসকিউএল সার্ভার শর্ট সার্কিট মূল্যায়নও ব্যবহার করে বলে মনে হয়।

নিম্নলিখিত পরীক্ষায় আমার 3 টি পরীক্ষা রয়েছে। প্রথমটি সর্বদা সত্য, দ্বিতীয়টি টেবিলটি উল্লেখ না করে ব্যর্থ হয় এবং তৃতীয়টি কেবলমাত্র ডেটা বিবেচনায় নেওয়া হলে ব্যর্থ হয়।
এই বিশেষ রানে উভয় সারি সফলভাবে ফিরে আসে। যদি আমি প্রথম WHEN, বা প্রথম এবং দ্বিতীয়টির বিষয়ে মন্তব্য করি তবে আমি ব্যর্থতা পাই।

CREATE TABLE casetest (test varchar(10))
GO
INSERT INTO casetest VALUES ('12345'),('abcdef')
GO

SELECT CASE WHEN LEN(test)>1 THEN test
        WHEN 1/0 = 1 THEN 'abc'
        WHEN CAST(test AS int) = 1 THEN 'def'
        END
FROM casetest
GO

1

যদি WHEREশর্তে কেস স্টেটমেন্ট ব্যবহৃত হয় এবং প্রথম বিবরণ যখন টেবিল থেকে কলামের মানগুলি মূল্যায়নের সাথে জড়িত থাকে এবং টেবিলের প্রথম সারিতে এই শর্তটি সন্তুষ্ট না হয়, বিবৃতি দেওয়ার পরে কেস স্টেটমেন্ট পরবর্তী কেসে যাবে।

declare @tbl table(id int)
insert into @tbl values(1)
insert into @tbl values(2)
insert into @tbl values(3)

--Fails on the divide by zero.
SELECT * FROM @tbl
where  CASE 
        WHEN id = 2 THEN 1 -- first row in table will not satisfy the condition
        WHEN 2/0 = 1 THEN 1
        ELSE 0
      END =1

-- when filter the records to only who will staisfy the first case when condition, it 
will not fail on the divide by zero
SELECT * FROM @tbl
where ID=2 and -- first row in table will  satisfy the condition
  CASE 
    WHEN id = 2 THEN 1
    WHEN 2/0 = 1 THEN 1
    ELSE 0
  END =1

1

মাইএসকিউএলে এটি প্রথম সত্য বিকল্পে কেস স্টেটমেন্ট থেকে প্রস্থান করবে। আপনার যদি একাধিক সত্যের মানগুলির সম্ভাবনা থাকে তবে আপনি পছন্দসই উত্তরটি সিকোয়েন্সের আগে রাখতে চান।


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