Как я могу использовать IF ELSE в предложении WHERE на основе строковой переменной? - PullRequest
0 голосов
/ 02 июня 2011

У меня есть ИП.Возвращает некоторое количество строк.Вот SP:

ALTER PROCEDURE [dbo].[spGetClients]

( @orderBy varchar(50), @startAge int, @endAge int, @sex char, @staffId nvarchar(1024), @statusId nvarchar(1024), @ethnicityId nvarchar(1024), @treatmentProviderId nvarchar(1024) ) AS BEGIN SET NOCOUNT ON;

IF(@orderBy = 'Consumer Name')
BEGIN
    SELECT c.Id, dbo.GetClientFullName(c.FirstName, c.MiddleInit, c.LastName) AS ClientName, 
    c.DateOfBirth, dbo.GetAge(c.DateOfBirth, GETDATE()) AS Age, c.Sex, 
    dbo.GetClientStatus(c.Id, @statusId) AS Status, ca.Address, co.Phone, 
    dbo.GetEthnicity(c.Id, @ethnicityId) AS Ethnicity, dbo.GetDevelopmentalDisabilities(c.Id) AS Disabilities, 
    dbo.GetClientStaffContacts(c.Id, @staffId) AS Staff, dbo.GetClientContacts(c.Id) AS Contact, 
    dbo.GetClientInsuranceProviders(c.Id) AS HealthProvider, 
    dbo.GetClientTreatmentProviders(c.Id, @treatmentProviderId) AS TreatmentProvider
    FROM Client c  
    LEFT OUTER JOIN(        
        SELECT ca.ParentEntityId, ca.Address
        FROM ContactAddress ca
        INNER JOIN EntityName en ON en.Id = ca.EntityNameId AND en.Name = 'Client' 
        INNER JOIN GeneralLookup gl ON ca.glAddressTypeId = gl.Id AND gl.LookupItem = 'Primary'    
    ) ca ON c.Id = ca.ParentEntityId 
    LEFT OUTER JOIN(        
        SELECT co.ParentEntityId, co.ContactData Phone
        FROM ContactOther co
        INNER JOIN EntityName en ON en.Id = co.EntityNameId AND en.Name = 'Client' 
        INNER JOIN GeneralLookup gl ON co.glContactTypeId = gl.Id AND gl.LookupItem = 'Home'    
    ) co ON c.Id = co.ParentEntityId 
    LEFT OUTER JOIN GeneralStatus gs on gs.Id = c.StatusId
    where gs.Name <> 'Deleted' 
    and (dbo.GetAge(c.DateOfBirth, GETDATE()) BETWEEN @startAge and @endAge)
    and ((@sex = 'M' and c.sex = 'M') or (@sex = 'F' and c.Sex = 'F') or (@sex = '' and (c.Sex in ('M', 'F', ''))))
    and dbo.GetClientStaffContacts(c.Id, @staffId) is not null
    and dbo.GetClientStaffContacts(c.Id, @staffId) is not null
    and dbo.GetClientStatus(c.Id, @statusId) is not null 
    and dbo.GetEthnicity(c.Id, @ethnicityId) is not null 
    and dbo.GetClientTreatmentProviders(c.Id, @treatmentProviderId) is not null
    ORDER BY ClientName
END
END

UDF (пользовательские функции) - dbo.GetClientStaffContacts (c.Id, @staffId) и другие.Они возвращают несколько строк, которые также имеют значение null.Вот почему я использую последние 5 операторов в предложении where, чтобы можно было собирать только ненулевые значения.Все работает нормально, но проблема в том, что я хочу эту проверку ненулевого значения, только когда эти переменные НЕ являются пустой строкой:

@staffId nvarchar(1024), 
@statusId nvarchar(1024), 
@ethnicityId nvarchar(1024), 
@treatmentProviderId nvarchar(1024)

Как я могу решить эту проблему?Я хочу что-то вроде этого:

If @staffId <> '' then dbo.GetClientStaffContacts(c.Id, @staffId) is not null

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

Вы не можете делать логические сравнения внутри оператора CASE.Вы должны создать значение из выражения case, и тип каждого возможного значения должен быть одинаковым или конвертируемым:

CASE @staffId
    WHEN "" THEN 1
    ELSE
       CASE
           WHEN dbo.GetClientStaffContacts(c.Id, @staffId) is not null THEN 1
           ELSE 0
       END
END = 1

Было бы условием, которое вы могли бы вставить в ваше WHERE предложение


Возможны две формы выражения CASE:

  • Простой CASE (когда вы пытаетесь найти предложение WHEN, равное указанному значению после ключевого слова CASE) - это то, что делает внешнее выражение CASE (пытается найти предложение WHEN, которое соответствует значению @StaffId).
  • Searched CASE (когда вы пытаетесь сопоставить предложение WHEN на основе произвольных предикатов) - это то, что делает внутреннее выражение CASE (проверяет, является ли возвращаемое значение функции не нулевым)

Вы не можете определить состояние NULL / non-NULL, используя выражение Simple CASE, так какNULL не равно NULL (равно как и не равно).

0 голосов
/ 02 июня 2011
 AND  ((@staffId = "") OR (dbo.GetClientStaffContacts(c.Id, @staffId) is not null))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...