'যেখানে' ধারাটিতে এসকিউএল স্যুইচ / কেস


146

আমি আশেপাশে অনুসন্ধান করার চেষ্টা করেছি, তবে এমন কিছু খুঁজে পেল না যা আমাকে সাহায্য করবে।

আমি এসকিউএল এ করার চেষ্টা করছি:

declare @locationType varchar(50);
declare @locationID int;

SELECT column1, column2
FROM viewWhatever
WHERE
CASE @locationType
    WHEN 'location' THEN account_location = @locationID
    WHEN 'area' THEN xxx_location_area = @locationID
    WHEN 'division' THEN xxx_location_division = @locationID

আমি জানি যে প্রত্যেকের শেষে আমাকে '= @ লোকেশনআইডি' লাগানো উচিত ছিল না, তবে আমি বাক্য গঠনটি সঠিক হওয়ার কাছাকাছি পেতে পারি না। এসকিউএল প্রথম WHEN লাইনে আমার '=' সম্পর্কে অভিযোগ জানায় ...

কিভাবে আমি এটি করতে পারব?

উত্তর:


191
declare @locationType varchar(50);
declare @locationID int;

SELECT column1, column2
FROM viewWhatever
WHERE
@locationID = 
  CASE @locationType
      WHEN 'location' THEN account_location
      WHEN 'area' THEN xxx_location_area 
      WHEN 'division' THEN xxx_location_division 
  END

1
টমএইচের নীচে আপনার উত্তরের মন্তব্যে যেমন উল্লেখ করা হয়েছে, আপনি এসকিউএলকে ভুলভাবে গঠন করেছেন। আমি এসকিউএল সার্ভার 2005 এ আমার পরীক্ষা করেছি এবং এটি দুর্দান্ত কাজ করেছে।
বব প্রোবস্ট

@ এর দরকার কেন? তারা কি করে?
তাদেজ

2
@ টি-স্কুএলে ভেরিয়েবলগুলি নির্দেশ করে, @, @ লোকেশনআইডি ব্যতীত একটি কলামের নাম হিসাবে ব্যাখ্যা করা হবে।
খ্রিস্টান স্লোপার

70

কেস স্টেটমেন্ট ব্যতীত ...

SELECT column1, column2
FROM viewWhatever
WHERE
    (@locationType = 'location' AND account_location = @locationID)
    OR
    (@locationType = 'area' AND xxx_location_area = @locationID)
    OR
    (@locationType = 'division' AND xxx_location_division = @locationID)

2
শর্ত পূরণের পরে কেস স্টেটমেন্টটি প্রস্থান হওয়ায় এটি কিছুটা আলাদা ফলাফল দেবে - তবে ওআর সিনট্যাক্স সমস্ত সম্ভাবনার মূল্যায়ন করবে
টেম্বার

1
@ সেপ্টেম্বর এমনকি এসকিউএল প্রক্রিয়াগত ভাষা হলেও যদি প্রথম OR সত্য হয় তবে বাকী বাক্য মূল্যায়ন হয় না। যেহেতু এসকিউএল একটি ঘোষণামূলক ভাষা, আপনি কীভাবে জানবেন যে ডিবিএম সমস্ত ওআর মূল্যায়ন করবে? আন্তরিক প্রশ্ন, আমি বুঝতে পারি না।
আর্টুরুটোনা

এসকিউএল-তে বাকী প্রকাশটি OR সিনট্যাক্সে মূল্যায়ন করে। এটি ব্যবহার করে দেখুন (এটি আমাকে @ প্রতীকটি অন্তর্ভুক্ত করতে দেয় না - আপনি এটি পরীক্ষা করতে চাইলে আপনাকে এটি সংশোধন করতে হবে): var varchar (5) সেট var = '0' 2 / var নির্বাচন করুন যেখানে var <> 0 বা ISNUMERIC (var) = 1। আমি শর্তটি প্রস্থান করতে চাই কারণ var IS 0 এর সমান, তবে এটি সংখ্যাসূচক হয় কিনা তা যাচাই করার জন্য এটি এগিয়ে যায় এবং সুতরাং বিবৃতিটি ত্রুটি প্রদান করে।
tember

এইটি আমার ক্ষেত্রে সহায়তা করেছিল যেখানে টাইপের প্রতিটি মানের জন্য আমার তুলনা অপারেটর ছিল।
অ্যালেক্স

আরও ভাল DECLARE @locationType NVARCHAR(50) = 'youchoose' IF @locationType = 'location' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (account_location = @locationID) END IF @locationType = 'area' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (xxx_location_area = @locationID) END IF @locationType = 'division' BEGIN SELECT column1, column2 FROM viewWhatever WHERE (xxx_location_division = @locationID) END
লুক

35

আপনি এখানে যান।

SELECT
   column1, 
   column2
FROM
   viewWhatever
WHERE
CASE 
    WHEN @locationType = 'location' AND account_location = @locationID THEN 1
    WHEN @locationType = 'area' AND xxx_location_area = @locationID THEN 1
    WHEN @locationType = 'division' AND xxx_location_division = @locationID THEN 1
    ELSE 0
END = 1

5
ঠিক আছে, আমি লিখেছি যে নির্বাচন করুন কলাম 1 হিসাবে, কলাম 2 থেকে যে কোনও দর্শন দেখুন (@ লোকেশনটাইপ = 'অবস্থান' এবং অ্যাকাউন্ট_লোকেশন = @ লোকেশনআইডি) বা (@ লোকেশনটাইপ = 'অঞ্চল' এবং xxx_location_area = @ লোকেশনআইডি) বা (@ লোকেশনটাইপ = 'বিভাগ') এবং এক্সএক্সএক্সএক্সএক্স_লোকেশন_বিভাজন = @ লোকেশন)
জানু ডি ভোস

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

1
সত্যিই দুর্দান্ত যদি আপনি আলাদা ব্যবহার করতে চান যেখানে প্রথম ধরণের ইন্টের মতো ধরণের এবং ২ য় তারিখে এনভারচারার। বব প্রোবস্ট সমাধান সহ কার্যকর হয় না। ধন্যবাদ
জুলিয়ান 50

6

আমি বলব এটি ত্রুটিযুক্ত টেবিল কাঠামোর সূচক। সম্ভবত বিভিন্ন অবস্থানের ধরণগুলি বিভিন্ন টেবিলগুলিতে পৃথক করা উচিত, আপনাকে আরও সমৃদ্ধ অনুসন্ধান করতে সক্ষম করে এবং আশেপাশে অতিরিক্ত অতিরিক্ত কলামগুলি এড়াতে সক্ষম করে।

আপনি যদি কাঠামোটি পরিবর্তন করতে অক্ষম হন তবে নীচের মতো কিছু কাজ করতে পারে:

SELECT
    *
FROM
    Test
WHERE
    Account_Location = (
        CASE LocationType
          WHEN 'location' THEN @locationID
          ELSE Account_Location
        END
    )
    AND
    Account_Location_Area = (
        CASE LocationType
          WHEN 'area' THEN @locationID
          ELSE Account_Location_Area
        END
    )

এবং এরপরে ... আমরা উড়ে ক্যোয়ারির কাঠামোটি পরিবর্তন করতে পারি না, তবে আমরা পূর্বাভাসগুলি তাদের সমান করে এটিকে ওভাররাইড করতে পারি।

সম্পাদনা: উপরের পরামর্শগুলি অবশ্যই আরও অনেক ভাল, কেবল আমার অগ্রাহ্য করুন।


আমি মনে করি না এটি একটি ত্রুটিযুক্ত টেবিল কাঠামো। সারণীটি এইভাবে সেট আপ করা হয়েছিল যাতে পিতামাতার / সন্তানের অসীম সম্পর্কের সীমাহীন পরিমাণে থাকার জন্য এটি স্ব-রেফারেন্স হয়। বিশ্বাস করুন, এটা উদ্দেশ্য ছিল। আমি মনে করি না আমি কেবল একটি স্যুইচ স্টেটমেন্ট ব্যবহার করতে আমার টেবিলের কাঠামোটি পরিবর্তন করতে চাই। এটির গুরুত্বপূর্ণ এটি
মাইলস

5

এর সাথে সমস্যাটি হ'ল যখন এসকিউএল ইঞ্জিনটি এক্সপ্রেশনটি মূল্যায়ন করতে যায়, তখন এটি সঠিক টেবিলগুলি টানতে FROM অংশটি পরীক্ষা করে এবং তারপরে কোন বেস মানদণ্ড সরবরাহ করার জন্য কোন অংশটি সঠিকভাবে মূল্যায়ন করতে পারে না যা কোন কলামে ডায়নামিক অবস্থার যথাযথ মূল্যায়ন করতে পারে না বিরুদ্ধে পরীক্ষা।

আপনি যখন প্রাকটিক্টে WHERE মানদণ্ড পরীক্ষা করছেন যেমন আপনি যেখানে একটি ক্লজ ক্লজ ব্যবহার করতে পারেন

WHERE account_location = CASE @locationType
                              WHEN 'business' THEN 45
                              WHEN 'area' THEN 52
                         END

সুতরাং আপনার বিশেষ ক্ষেত্রে, আপনার সঞ্চিত পদ্ধতিতে ক্যোয়ারী রাখা বা তিনটি পৃথক ক্যোয়ারী তৈরি করা দরকার।


5

বা অপারেটর ক্ষেত্রে যখন বিকল্প হতে পারে

ALTER PROCEDURE [dbo].[RPT_340bClinicDrugInventorySummary]
    -- Add the parameters for the stored procedure here
     @ClinicId BIGINT = 0,
     @selecttype int,
     @selectedValue varchar (50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT
    drugstock_drugname.n_cur_bal,drugname.cdrugname,clinic.cclinicname

FROM drugstock_drugname
INNER JOIN drugname ON drugstock_drugname.drugnameid_FK = drugname.drugnameid_PK
INNER JOIN drugstock_drugndc ON drugname.drugnameid_PK = drugstock_drugndc.drugnameid_FK
INNER JOIN drugndc ON drugstock_drugndc.drugndcid_FK = drugndc.drugid_PK
LEFT JOIN clinic ON drugstock_drugname.clinicid_FK = clinic.clinicid_PK

WHERE   (@ClinicId = 0 AND 1 = 1)
    OR  (@ClinicId != 0 AND drugstock_drugname.clinicid_FK = @ClinicId)

    -- Alternative Case When You can use OR
    AND ((@selecttype = 1 AND 1 = 1)
    OR  (@selecttype = 2 AND drugname.drugnameid_PK = @selectedValue)
    OR  (@selecttype = 3 AND drugndc.drugid_PK = @selectedValue)
    OR  (@selecttype = 4 AND drugname.cdrugclass = 'C2')
    OR  (@selecttype = 5 AND LEFT(drugname.cdrugclass, 1) = 'C'))

ORDER BY clinic.cclinicname, drugname.cdrugname
END

3

এই জিজ্ঞাসা চেষ্টা করুন। উপরের পোস্টের উত্তর:

select @msgID, account_id
    from viewMailAccountsHeirachy
    where 
    CASE @smartLocationType
        WHEN 'store' THEN account_location
        WHEN 'area' THEN xxx_location_area 
        WHEN 'division' THEN xxx_location_division 
        WHEN 'company' THEN xxx_location_company 
    END  = @smartLocation

2
: যে কেহ ভবিষ্যতে এই সার্চ করার জন্য: উপরে @ বব-prost থেকে গৃহীত উত্তর হিসাবে একই stackoverflow.com/a/206500/264786
ArturoTena

2

এটা চেষ্টা কর:

WHERE (
    @smartLocationType IS NULL 
    OR account_location = (
         CASE
            WHEN @smartLocationType IS NOT NULL 
                 THEN @smartLocationType
            ELSE account_location 
         END
    )
)

1
ডাউনভোটেড কারণ আমি বুঝতে পারছি না যে এটি প্রদত্ত স্ট্রিংগুলির (যেমন 'অবস্থান', 'অঞ্চল', 'বিভাগ') এর মধ্যে কীভাবে চয়ন করতে পারে
আর্টুরুটোনা

0
CREATE PROCEDURE [dbo].[Temp_Proc_Select_City]
    @StateId INT
AS  
        BEGIN       
            SELECT * FROM tbl_City 
                WHERE 
                @StateID = CASE WHEN ISNULL(@StateId,0) = 0 THEN 0 ELSE StateId END ORDER BY CityName
        END

-1
Case Statement in SQL Server Example

Syntax

CASE [ expression ]

   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n

   ELSE result

END

Example

SELECT contact_id,
CASE website_id
  WHEN 1 THEN 'TechOnTheNet.com'
  WHEN 2 THEN 'CheckYourMath.com'
  ELSE 'BigActivities.com'
END
FROM contacts;

OR

SELECT contact_id,
CASE
  WHEN website_id = 1 THEN 'TechOnTheNet.com'
  WHEN website_id = 2 THEN 'CheckYourMath.com'
  ELSE 'BigActivities.com'
END
FROM contacts;

4
ডাউনভোটেড কারণ এই উত্তরটি প্রশ্নের সাথে সম্পর্কিত নয়। প্রশ্নটি হ'ল WHERE ধারাটিতে CASE কীভাবে ব্যবহার করবেন, একটি নির্বাচিত কলামে CASE কীভাবে ব্যবহার করবেন তা নয়।
আর্টুরুটোনা

-2

এই কোয়েরি চেষ্টা করুন। এটি বোঝা খুব সহজ:

CREATE TABLE PersonsDetail(FirstName nvarchar(20), LastName nvarchar(20), GenderID int);
GO

INSERT INTO PersonsDetail VALUES(N'Gourav', N'Bhatia', 2),
              (N'Ramesh', N'Kumar', 1),
              (N'Ram', N'Lal', 2),
              (N'Sunil', N'Kumar', 3),
              (N'Sunny', N'Sehgal', 1),
              (N'Malkeet', N'Shaoul', 3),
              (N'Jassy', N'Sohal', 2);
GO

SELECT FirstName, LastName, Gender =
    CASE GenderID
    WHEN 1 THEN 'Male'
    WHEN 2 THEN 'Female'
    ELSE 'Unknown'
    END
FROM PersonsDetail

1
কেউ যদি এই উত্তর লেখা: উপরে @ বব-prost থেকে গৃহীত উত্তর হিসাবে একই stackoverflow.com/a/206500/264786 এই কারণে Downvoted।
আর্তুরুটোনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.