এমএস এসকিউএল-এ যেখানে কোনও ক্লজের মধ্যে আইএফ ক্লজ ব্যবহার করা সম্ভব ?
উদাহরণ:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
এমএস এসকিউএল-এ যেখানে কোনও ক্লজের মধ্যে আইএফ ক্লজ ব্যবহার করা সম্ভব ?
উদাহরণ:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
উত্তর:
একটি CASE বিবৃতি ব্যবহার করুন
আপডেট করুন: পূর্ববর্তী বাক্য গঠন (কিছু লোকের দ্বারা নির্দেশিত হিসাবে) কাজ করে না। আপনি নিম্নলিখিত হিসাবে CASE ব্যবহার করতে পারেন:
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber) = 1 THEN
@OrderNumber
ELSE
'%' + @OrderNumber
END
অথবা আপনি @ এনজে রিডের মত একটি আইএফ বিবৃতি ব্যবহার করতে পারেন ।
CASE
বেশিরভাগ ক্ষেত্রেই উপযুক্ত সমাধানটি ব্যবহার করা। আমার ক্ষেত্রে, আমি তুলনা অপারেটরটি পরিবর্তন চেয়েছিলাম এবং তাই আমি পরবর্তী পদ্ধতিটি ব্যবহার করেছি।
আপনার কোনও আইএফ বা সিএসই ছাড়াই এটি করতে সক্ষম হওয়া উচিত
WHERE
(IsNumeric(@OrderNumber) AND
(CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR)
OR
(NOT IsNumeric(@OrderNumber) AND
OrderNumber LIKE ('%' + @OrderNumber))
এসকিউএল এর স্বাদের উপর নির্ভর করে আপনাকে অন্তর্নিহিত ক্যাসেটগুলি সমর্থন করে কিনা তার উপর নির্ভর করে অর্ডার নম্বরে ক্যাসটগুলি কোনও আইএনটি বা ভিউচারেআর থেকে ঝাঁকুনির প্রয়োজন হতে পারে।
এটি হ'ল একটি দফার মধ্যে একটি খুব সাধারণ কৌশল। আপনি যেখানে যেখানে ক্লাউজে কিছু "আইএফ" যুক্তি প্রয়োগ করতে চান তবে আপনার বুলিয়ান এবং অতিরিক্ত যে শর্তটি প্রয়োগ করা দরকার সেখানে অতিরিক্ত শর্ত যুক্ত করতে হবে।
আপনার মোটেই আইএফ স্টেটমেন্টের দরকার নেই।
WHERE
(IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
where (@AdmUserId is null or CurrentOrder.CustomerAdmUserId = @AdmUserId)
থাকলে ফিল্টার করুন : অথবা অন্তর্ভুক্তডিলিট = 0: কেবলমাত্র ফিল্টার করুন where (@IncludeDeleted = 1 or ItemObject.DeletedFlag = 0)
এসকিউএল এ করার ভাল উপায় নেই। কিছু পন্থা আমি দেখেছি:
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
এর, অথবা আপনি অনেক নেস্টেড হয় আছে যদি
আইএফ এর পরিবর্তে একটি CASE বিবৃতি ব্যবহার করুন ।
আপনি CASE বিবৃতি চান
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
আমি মনে করি যে যেখানে ... যেমন / = ... কেস ... তারপর ... বুলিয়ানদের সাথে কাজ করতে পারে। আমি টি এসকিউএল ব্যবহার করছি।
পরিস্থিতি: আসুন আমরা বলি যে আপনি বুলটি মিথ্যা হলে ব্যক্তি -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;
যেখানে (ইসনুমিক (@ অর্ডার নাম্বার) <> 1 বা অর্ডার নাম্বার = @ অর্ডার নাম্বার) এবং (ইসনম্বার (@ অর্ডার নাম্বার) = 1 বা অর্ডার নাম্বার '%' পছন্দ করে + @ অর্ডার নাম্বার + '%')
IF P THEN Q ELSE R
<=>
( ( NOT P ) OR Q ) AND ( P OR R )
সিএএসই বিবৃতি সর্বদা আইএফ এর চেয়ে ভাল বিকল্প ।
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
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
লাইনের ক্ষেত্রে কন্ডিশন সঠিকভাবে কাজ করবে।
নীচের উদাহরণটি বুলিয়ান এক্সপ্রেশনের অংশ হিসাবে একটি ক্যোয়ারী চালায় এবং তারপরে বুলিয়ান অভিব্যক্তির ফলাফলের ভিত্তিতে কিছুটা পৃথক স্টেটমেন্ট ব্লক কার্যকর করে। প্রতিটি স্টেটমেন্ট ব্লক শুরু হয় বিগইন দিয়ে এবং সমাপ্তি দিয়ে শেষ হয়।
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
স্কেল সার্ভারে আমার একই সমস্যা ছিল আমি কেবলমাত্র প্যারামিটারটি মিথ্যা হলে একটি এবং বিবৃতি ব্যবহার করতে চেয়েছিলাম এবং সত্য হিসাবে আমাকে উভয় মান সত্য এবং মিথ্যা প্রদর্শন করতে হয়েছিল তাই আমি এটি এইভাবে ব্যবহার করেছি
(T.IsPublic = @ShowPublic or @ShowPublic = 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
দেখুন এই সাহায্য করে কিনা।
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