এসকিউএল: যদি বিধি যেখানে বিধি


203

এমএস এসকিউএল-এ যেখানে কোনও ক্লজের মধ্যে আইএফ ক্লজ ব্যবহার করা সম্ভব ?

উদাহরণ:

WHERE
    IF IsNumeric(@OrderNumber) = 1
        OrderNumber = @OrderNumber
    ELSE
        OrderNumber LIKE '%' + @OrderNumber + '%'

উত্তর:


212

একটি CASE বিবৃতি ব্যবহার করুন
আপডেট করুন: পূর্ববর্তী বাক্য গঠন (কিছু লোকের দ্বারা নির্দেশিত হিসাবে) কাজ করে না। আপনি নিম্নলিখিত হিসাবে CASE ব্যবহার করতে পারেন:

WHERE OrderNumber LIKE
  CASE WHEN IsNumeric(@OrderNumber) = 1 THEN 
    @OrderNumber 
  ELSE
    '%' + @OrderNumber
  END

অথবা আপনি @ এনজে রিডের মত একটি আইএফ বিবৃতি ব্যবহার করতে পারেন ।


[লেখকের আপডেটের পরে দ্রষ্টব্য]: এটি কার্যকর হওয়া উচিত, তবে কোনও ম্যাচ পাওয়া গেছে কিনা তা নিশ্চিত করার জন্য আপনার উভয় পক্ষের ট্রিম () করা উচিত। আমার মনে খুব খারাপ লাগছে যে এখনও বিরল ঘটনাগুলি মিলছে না to
ইউরো মিশেল্লি

1
CASEবেশিরভাগ ক্ষেত্রেই উপযুক্ত সমাধানটি ব্যবহার করা। আমার ক্ষেত্রে, আমি তুলনা অপারেটরটি পরিবর্তন চেয়েছিলাম এবং তাই আমি পরবর্তী পদ্ধতিটি ব্যবহার করেছি।
বিরলা

142

আপনার কোনও আইএফ বা সিএসই ছাড়াই এটি করতে সক্ষম হওয়া উচিত

 WHERE 
   (IsNumeric(@OrderNumber) AND
      (CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR)
 OR
   (NOT IsNumeric(@OrderNumber) AND
       OrderNumber LIKE ('%' + @OrderNumber))

এসকিউএল এর স্বাদের উপর নির্ভর করে আপনাকে অন্তর্নিহিত ক্যাসেটগুলি সমর্থন করে কিনা তার উপর নির্ভর করে অর্ডার নম্বরে ক্যাসটগুলি কোনও আইএনটি বা ভিউচারেআর থেকে ঝাঁকুনির প্রয়োজন হতে পারে।

এটি হ'ল একটি দফার মধ্যে একটি খুব সাধারণ কৌশল। আপনি যেখানে যেখানে ক্লাউজে কিছু "আইএফ" যুক্তি প্রয়োগ করতে চান তবে আপনার বুলিয়ান এবং অতিরিক্ত যে শর্তটি প্রয়োগ করা দরকার সেখানে অতিরিক্ত শর্ত যুক্ত করতে হবে।


2
আমি ভাবতে পেরেছি আপনি কেস সমাধানের তুলনায় কিছুটা পারফরম্যান্স হিট করবেন, যদিও, যেহেতু এই সমস্ত শর্তের মূল্যায়ন হয়, না?
কেভিন ফেয়ারচাইল্ড

আমি সর্বদা ভুলে যাই যে এসকিউএল-তে কোনও শর্তসাপূর্ণ বিবৃতিগুলি বুলিয়ান যুক্তির সাথে প্রতিস্থাপন করতে পারে। অনুস্মারকটির জন্য ধন্যবাদ, এটি একটি খুব দরকারী কৌশল!
কোডেক্সআর্কানিয়াম

1
এসকিউএল সার্ভার বুলিয়ান যুক্তি প্রক্রিয়াকরণের কারণে এই সমাধানটি আসলে সেরা। CASE স্টেটমেন্টগুলিতে যেখানে বুলিয়ান ক্ষেত্রেগুলির তুলনায় ক্লজগুলি কম দক্ষ, যদি প্রথম চেক ব্যর্থ হয়, এসকিউএল লাইনটি প্রক্রিয়াকরণ বন্ধ করে দিয়ে চালিয়ে যাবে। এটি আপনার প্রক্রিয়াজাতকরণের সময় বাঁচায়। এছাড়াও, আপনার বুলিয়ান চেকের অন্যদিকে আরও ব্যয়বহুল বিবৃতিটি সর্বদা রাখুন।
স্টিভ

একটি খুব মার্জিত সমাধানের জন্য ধন্যবাদ। আপনি যে পদ্ধতিটি ব্যবহার করেছেন তাতে একটি টিউটোরিয়াল পাওয়া গেছে যা লোকদের সহায়তা করতে পারে। weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspx
ধনী

1
@ আপনি যে লিঙ্কটি সরবরাহ করেছেন তা কাশ হ'ল একটি রেজিস্টার-টু পঠন, এমন কোনও প্রকাশ্যে উপলভ্য দলিল রয়েছে যা আপনি যা বলছেন তা বর্ণনা করে?
স্টিভ

29

আপনার মোটেই আইএফ স্টেটমেন্টের দরকার নেই।

WHERE
    (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')

2
আমি সত্যিই এই পদ্ধতির পছন্দ। অল্টারনেটিভ ব্যবহার: কেবল অ্যাডমুসেআইডের একটি মান where (@AdmUserId is null or CurrentOrder.CustomerAdmUserId = @AdmUserId) থাকলে ফিল্টার করুন : অথবা অন্তর্ভুক্তডিলিট = 0: কেবলমাত্র ফিল্টার করুন where (@IncludeDeleted = 1 or ItemObject.DeletedFlag = 0)
ক্যাস্পার হালভাস জেনসেন

WHERE ধারাটিতে IN ফিল্টার ব্যবহার করার সময় এটি ভাল কাজ করে। এটি COALESCE ব্যবহার করতে হবে এবং এটি পড়া শক্ত, কারণ এটি পড়ার জন্য সোজাসুজি যুক্তিযুক্ত, এটি CASE এর সাথে এটি করতে গোলমাল হয়ে যায়। টিএসকিউএল CASE বিবৃতি ফিল্টার ইন বা ফিল্টার নয় যেখানে জন্য ক্লজ
pholcroft

14

এসকিউএল এ করার ভাল উপায় নেই। কিছু পন্থা আমি দেখেছি:

1) বুলিয়ান অপারেটরগুলির সাথে মিলিত CASE ব্যবহার করুন:

WHERE
    OrderNumber = CASE 
        WHEN (IsNumeric(@OrderNumber) = 1)
        THEN CONVERT(INT, @OrderNumber)
        ELSE -9999 -- Some numeric value that just cannot exist in the column
    END
    OR 
    FirstName LIKE CASE
        WHEN (IsNumeric(@OrderNumber) = 0)
        THEN '%' + @OrderNumber
        ELSE ''
    END

2) নির্বাচন করুন বাইরে নির্বাচন করুন

IF (IsNumeric(@OrderNumber)) = 1
BEGIN
    SELECT * FROM Table
    WHERE @OrderNumber = OrderNumber
END ELSE BEGIN
    SELECT * FROM Table
    WHERE OrderNumber LIKE '%' + @OrderNumber
END

3) দীর্ঘ স্ট্রিং ব্যবহার করে আপনার এসকিউএল বিবৃতিটি শর্তাধীন রচনা করুন এবং তারপরে এক্সইসিইসি ব্যবহার করুন

তৃতীয় পদ্ধতিটি ঘৃণ্য, কিন্তু এটির মধ্যে কেবলমাত্র এমনটাই মনে হয় যে যদি আপনার মতো বিভিন্ন পরিবর্তনশীল শর্ত থাকে works


চতুর্থ পন্থাটি হল আপনার সমস্ত IF...ELSE...শর্তাদি বুলিয়ান ANDএবং ORউপরের @ njr101 উত্তরের হিসাবে রূপান্তর করা । Downside ^ এই পদ্ধতির এটা হতে পারে যে মস্তিষ্কের fryingly কঠিন যদি অনেক আছে IFএর, অথবা আপনি অনেক নেস্টেড হয় আছে যদি
ডন জন্য Cheadle



3

আমি মনে করি যে যেখানে ... যেমন / = ... কেস ... তারপর ... বুলিয়ানদের সাথে কাজ করতে পারে। আমি টি এসকিউএল ব্যবহার করছি।

পরিস্থিতি: আসুন আমরা বলি যে আপনি বুলটি মিথ্যা হলে ব্যক্তি -30 এর শখ এবং বুল সত্য হলে ব্যক্তি -২২ এর শখ পেতে চান। (কারও মতে শখের দর্শনগুলি ব্যবসায়িক গণনা চক্রের 90% এর উপরে থাকে, সুতরাং নিকটস্থ অর্থ প্রদান করুন))

CREATE PROCEDURE sp_Case
@bool   bit
AS
SELECT Person.Hobbies
FROM Person
WHERE Person.ID = 
    case @bool 
        when 0 
            then 30
        when 1
            then 42
    end;

2
যেখানে (ইসনুমিক (@ অর্ডার নাম্বার) <> 1 বা অর্ডার নাম্বার = @ অর্ডার নাম্বার) 
             এবং (ইসনম্বার (@ অর্ডার নাম্বার) = 1 বা অর্ডার নাম্বার '%' পছন্দ করে 
                                              + @ অর্ডার নাম্বার + '%')

IF P THEN Q ELSE R <=> ( ( NOT P ) OR Q ) AND ( P OR R )
সম্মিলিত

1

সিএএসই বিবৃতি সর্বদা আইএফ এর চেয়ে ভাল বিকল্প ।

  WHERE  vfl.CreatedDate >= CASE WHEN @FromDate IS NULL THEN vfl.CreatedDate ELSE  @FromDate END
    AND vfl.CreatedDate<=CASE WHEN @ToDate IS NULL THEN vfl.CreatedDate ELSE @ToDate END 

1
    WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE  '%' + @OrderNumber END

লাইনের ক্ষেত্রে কন্ডিশন সঠিকভাবে কাজ করবে।


0

নীচের উদাহরণটি বুলিয়ান এক্সপ্রেশনের অংশ হিসাবে একটি ক্যোয়ারী চালায় এবং তারপরে বুলিয়ান অভিব্যক্তির ফলাফলের ভিত্তিতে কিছুটা পৃথক স্টেটমেন্ট ব্লক কার্যকর করে। প্রতিটি স্টেটমেন্ট ব্লক শুরু হয় বিগইন দিয়ে এবং সমাপ্তি দিয়ে শেষ হয়।

USE AdventureWorks2012;
GO
DECLARE @AvgWeight decimal(8,2), @BikeCount int
IF 
(SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
BEGIN
   SET @BikeCount = 
        (SELECT COUNT(*) 
         FROM Production.Product 
         WHERE Name LIKE 'Touring-3000%');
   SET @AvgWeight = 
        (SELECT AVG(Weight) 
         FROM Production.Product 
         WHERE Name LIKE 'Touring-3000%');
   PRINT 'There are ' + CAST(@BikeCount AS varchar(3)) + ' Touring-3000 bikes.'
   PRINT 'The average weight of the top 5 Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.';
END
ELSE 
BEGIN
SET @AvgWeight = 
        (SELECT AVG(Weight)
         FROM Production.Product 
         WHERE Name LIKE 'Touring-3000%' );
   PRINT 'Average weight of the Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.' ;
END ;
GO

নেস্টেড আইএফ ব্যবহার করে ... ELSE বিবৃতি নীচের উদাহরণটি দেখায় যে কীভাবে একটি আইএফ… ELSE বিবৃতি অন্যের ভিতরে বাসাতে পারে। প্রতিটি বিবৃতি পরীক্ষা করতে @ সংখ্যা ভেরিয়েবল 5, 50 এবং 500 এ সেট করুন।

DECLARE @Number int
SET @Number = 50
IF @Number > 100
   PRINT 'The number is large.'
ELSE 
   BEGIN
      IF @Number < 10
      PRINT 'The number is small'
   ELSE
      PRINT 'The number is medium'
   END ;
GO

2
এটি প্রাসঙ্গিক বলে মনে হচ্ছে না। এটি যেখানে কোনও আইনে আইএফ (বা কোনও শর্তাধীন কোড) ব্যবহার করে না।
ভিন্স বাউডরেন

0

স্কেল সার্ভারে আমার একই সমস্যা ছিল আমি কেবলমাত্র প্যারামিটারটি মিথ্যা হলে একটি এবং বিবৃতি ব্যবহার করতে চেয়েছিলাম এবং সত্য হিসাবে আমাকে উভয় মান সত্য এবং মিথ্যা প্রদর্শন করতে হয়েছিল তাই আমি এটি এইভাবে ব্যবহার করেছি

(T.IsPublic = @ShowPublic or  @ShowPublic = 1)

-1
If @LstTransDt is Null
                begin
                    Set @OpenQty=0
                end
            else
                begin
                   Select   @OpenQty=IsNull(Sum(ClosingQty),0)  
                   From  ProductAndDepotWiseMonitoring  
                   Where   Pcd=@PCd And PtpCd=@PTpCd And TransDt=@LstTransDt      
                end 

দেখুন এই সাহায্য করে কিনা।


-6
USE AdventureWorks2012;
GO
IF 
(SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
PRINT 'There are more than 5 Touring-3000 bicycles.'
ELSE PRINT 'There are 5 or less Touring-3000 bicycles.' ;
GO

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