سؤال

أنا إنشاء إجراء مخزن العودة إلى نتائج البحث فيها بعض من معلمات اختيارية.

أريد "إذا كان البيان" في بلدي حيث شرط ولكن لا أستطيع الحصول على عمل.على حيث شرط أن مرشح فقط غير فارغة المعلمات.

هنا sp

ALTER PROCEDURE spVillaGet 
-- Add the parameters for the stored procedure here
@accomodationFK int = null,
@regionFK int = null,
@arrivalDate datetime,
@numberOfNights int,
@sleeps int = null,
@priceFloor money = null,
@priceCeil money = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
select tblVillas.*, tblWeeklyPrices.price from tblVillas
INNER JOIN tblWeeklyPrices on tblVillas.villaId = tblWeeklyPrices.villaFK
where 
    If @accomodationFK <> null then
        accomodationTypeFK = @accomodationFK 
     @regionFK <> null Then
        And regionFK = @regionFK 
    IF @sleeps <> null Then
        And sleeps = @sleeps 
    IF @priceFloor <> null Then
        And price >= @priceFloor And price <= @priceCeil


END

أي أفكار كيف نفعل هذا ؟

هل كانت مفيدة؟

المحلول

select tblVillas.*, tblWeeklyPrices.price 
from tblVillas
INNER JOIN tblWeeklyPrices on tblVillas.villaId = tblWeeklyPrices.villaFK
where (@accomodationFK IS null OR accomodationTypeFK = @accomodationFK)
  AND (@regionFK IS null or regionFK = @regionFK)
  AND (@sleeps IS null OR sleeps = @sleeps)
  AND (@priceFloor IS null OR (price BETWEEN @priceFloor And @priceCeil))

نصائح أخرى

لقد استخدمنا الكثير من COALESCE هنا في الماضي "ديناميكية حيث الشروط"مثل كنت تتحدث عن.

SELECT *
FROM  vehicles
WHERE ([vin]   LIKE COALESCE(@vin, [vin])     + '%' ESCAPE '\')
  AND ([year]  LIKE COALESCE(@year, [year])   + '%' ESCAPE '\')
  AND ([make]  LIKE COALESCE(@make, [make])   + '%' ESCAPE '\')
  AND ([model] LIKE COALESCE(@model, [model]) + '%' ESCAPE '\')

وتنشأ مشكلة كبيرة على الرغم عندما تريد اختياريا تصفية العمود أيضا nullable...إذا كانت البيانات في عمود null معين صف المستخدم لم أدخل أي شيء إلى البحث عن طريق لهذا العمود (حتى إدخال المستخدم هو أيضا null) ، ثم هذا الصف حتى لا تظهر في النتائج (والتي ، إذا الفلاتر اختيارية غير الإقصائية السلوك).

وذلك لتعويض nullable الحقول, يمكنك في نهاية المطاف الحاجة إلى القيام مسير تبحث SQL مثل ذلك:

SELECT *
FROM  vehicles
WHERE (([vin]   LIKE COALESCE(@vin, [vin])     + '%' ESCAPE '\')
       OR (@vin IS NULL AND [vin] IS NULL))
  AND (([year]  LIKE COALESCE(@year, [year])   + '%' ESCAPE '\')
       OR (@year IS NULL AND [year] IS NULL))
  AND (([make]  LIKE COALESCE(@make, [make])   + '%' ESCAPE '\')
       OR (@make IS NULL AND [make] IS NULL))
  AND (([model] LIKE COALESCE(@model, [model]) + '%' ESCAPE '\')
       OR (@model IS NULL AND [model] IS NULL))

وفقط لكي نفهم، وإذا كان قانون الإجراءات في T-SQL. ذلك أن تكون canot المستخدمة في إدراج / تحديث / حذف / حدد بيان أنها يمكن أن تستخدم فقط لتحديد أي من بيانين الذي تريد تشغيله. عندما كنت في حاجة الاحتمالات المختلفة في بيان، يمكنك القيام به على النحو الوارد أعلاه أو استخدام عبارة حالة.

ويمكنك أيضا استخدام ISNULL أو تلتحم الدالة

Where accomodationTypeFK = IsNull(@accomodationFK, accomodationTypeFK)
    And regionFK = Coalesce(@regionFK,regionFK)
    And sleeps = IsNull(@sleeps,sleeps ) 
    And price Between IsNull(@priceFloor, Price) And IsNull(priceCeil, Price)  

وهذا لا يختلف عن اقتراح مايكل فوق ...

وISNULL ()، وتلتحم () عمل أكثر أو أقل بنفس الطريقة، يعودون أول حجة غير خالية في القائمة، باستثناء ISNULL يسمح سوى 2 الحجج، وتلتحم يمكن أن تتخذ أي عدد ...

HTTP: / /blogs.msdn.com/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx

ومحاولة وضع بيان IF الخاص في جميع أنحاء بيان SQL بأكمله. وهذا يعني أن يكون بيان SQL واحدة لكل حالة. التي عملت بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top