حيث باطل ، ليست فارغة أو لا يوجد فيها شرط اعتمادا على SQL Server قيمة المعلمة

StackOverflow https://stackoverflow.com/questions/810714

  •  03-07-2019
  •  | 
  •  

سؤال

يجب إجراء مخزن في SQL Server 2000 الذي يقوم بإجراء بحث على أساس قيم المعلمات.إحدى المعلمات التي تم تمريرها في أحتاج مختلفة WHERE شرط اعتمادا على قيمتها - المشكلة هي أن القيم 3 سيكون فيها MyColumn

  1. IS NULL
  2. IS NOT NULL
  3. ANY VALUE (NULL AND NOT NULL) (أساسا لا WHERE شرط)

لدي بعض كتلة العقلية في الخروج مع بناء الجملة الصحيح.هل هذا ممكن أن تفعل في واحد select دون أداء بعض IF @parameter BEGIN ... END المتفرعة?

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

المحلول

هنا هو كيف يمكنك حل هذه باستخدام واحد WHERE شرط:

WHERE (@myParm = value1 AND MyColumn IS NULL)
OR  (@myParm = value2 AND MyColumn IS NOT NULL)
OR  (@myParm = value3)

ساذج استخدام بيان حالة لا يعمل, ، هذا يعني ما يلي:

SELECT Field1, Field2 FROM MyTable
WHERE CASE @myParam
    WHEN value1 THEN MyColumn IS NULL
    WHEN value2 THEN MyColumn IS NOT NULL
    WHEN value3 THEN TRUE
END

فمن الممكن حل هذا باستخدام حال البيان ، انظر onedaywhen هو الجواب

نصائح أخرى

يمكنك فقط أن تفعل شيئا من هذا القبيل:

SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)

شيء من هذا القبيل.

هذا هو كيف يمكن أن يتم ذلك باستخدام CASE:

DECLARE @myParam INT;
SET @myParam = 1;

SELECT * 
  FROM MyTable
 WHERE 'T' = CASE @myParam
             WHEN 1 THEN 
                CASE WHEN MyColumn IS NULL THEN 'T' END
             WHEN 2 THEN
                CASE WHEN MyColumn IS NOT NULL THEN 'T' END
             WHEN 3 THEN 'T' END;
WHERE MyColumn = COALESCE(@value,MyColumn) 
  • إذا @value هو NULL, ، مقارنة MyColumn إلى نفسها ، وتجاهل @value = no where البند.

  • إذا @value قيمة (NOT NULL) سوف مقارنة MyColumn إلى @value.

المرجع: تتجمع (Transact-SQL).

وسيلة أخرى الحالة:

SELECT *  
FROM MyTable
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL     THEN 1 
               WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1 
               WHEN @myParm = value3                          THEN 1 
          END

لقد كان النجاح مع هذا الحل.انها تقريبا مثل باتريك ، مع تطور قليلا.يمكنك استخدام هذه التعبيرات بشكل منفصل.إذا كانت المعلمة فارغة ، فإنه سيتم تجاهل كل القيم عمود البحث الخاصة بك سيتم عرضها ، بما في ذلك بالقيم الخالية.

SELECT * FROM MyTable
WHERE 
    --check to see if @param1 exists, if @param1 is blank, return all
    --records excluding filters below
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
AND
    --where you want to search multiple columns using the same parameter
    --enclose the first 'OR' expression in braces and enclose the entire 
    --expression 
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
AND
    --if your search requires a date you could do the following
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top