2016-07-26 4 views
-1

Застрял при использовании CASE с LIKE Оператор. В приведенной ниже хранимой процедуре все параметры не являются обязательными, поэтому, когда пользователь не вводит PatientName для поиска, то нижеследующий запрос не возвращает ожидаемые результаты, поскольку оператор LIKE находится за пределами, который является очевидным. Я искал что-то вроде этого, так что, когда пользователь не входит PatientName будетКорпус с аналогичным оператором

(c.LastName + c.Firstname) = @PatientNAme else 
(c.LastName + c.Firstname) like '%' + @PatientNAme + '%' 

* 

    (c.LastName + c.Firstname) (       
     CASE @PatientName       
      WHEN '' THEN @PatientName = (c.LastName + c.Firstname)       
      ELSE like '%' + @PatientName + '%'    
     END       
    ) 

* 

CREATE proc [dbo].[SearchParkPrescriptionDetails] 
    @DispenseID INT, 
    @ParkPrescriptionReasonId INT, 
    @PrescriptionParkType VARCHAR(50), 
    @PatientName VARCHAR(120), 
    @User VARCHAR(120), 
    @fromdate DATETIME, 
    @todate DATETIME, 
    @DateWiseSearch VARCHAR(3), 
    @PatientID INT 
AS 
BEGIN 
    SELECT 
      a.ParkPrescriptionId 
     , a.DispenseID 
     , a.ParkPrescriptionReasonId 
     , a.ParkDate 
     , (c.LastName + ' ' + c.Firstname) AS PatientName 
     , d.PrescriptionType 
     , e.ParkPrescriptionReason 
     , a.Notes 
     , b.ItemCount AS TotalItems 
     , g.ExemptionReason 
     ,a.[User] 
    FROM 
     ParkPrescriptionDetails a 
     INNER JOIN 
       Dis_DispenseMaster b 
     ON 
       a.DispenseID=b.DispenseID 
     INNER JOIN 
       Patient c 
     ON 
       b.PatientId = c.PatientId 
     INNER JOIN 
       Lookup_PrescriptionType d 
     ON 
       b.PrescriptionTypeId = d.PrescriptionTypeId 
     INNER JOIN 
       Lookup_ParkPrescriptionReason e 
     ON 
       a.ParkPrescriptionReasonId = e.ParkPrescriptionReasonId 
     LEFT JOIN 
       Lookup_ExemptionReason g 
     ON 
       b.ExemptionReasonId = g.ExemptionReasonId 
    WHERE 
     CONVERT(DATE, a.ParkDate) BETWEEN @fromdate AND @todate 
     AND a.RecallStatus    = 'N' 
     AND a.DispenseID    = (CASE @DispenseID WHEN 0 THEN a.DispenseID ELSE @DispenseID END) 
     AND b.PatientId    = (CASE @PatientID WHEN 0 THEN b.PatientId ELSE @PatientID END) 
     AND a.ParkPrescriptionReasonId = (CASE @ParkPrescriptionReasonId WHEN 0 THEN a.ParkPrescriptionReasonId ELSE @ParkPrescriptionReasonId END) 
     AND 
     (
       c.LastName + c.Firstname 
     )      LIKE (CASE @PatientName WHEN '' THEN (c.LastName + c.Firstname) ELSE '%' + @PatientName + '%' END) 
     AND a.[User]   LIKE (CASE @User WHEN '' THEN a.[User] ELSE '%' + @User + '%' END) 
     AND b.ParkPrescription = (CASE @PrescriptionParkType WHEN '' THEN b.ParkPrescription WHEN 'Park' THEN 'Y' END) 
     AND b.RecallPrescription = (CASE @PrescriptionParkType WHEN '' THEN b.RecallPrescription WHEN 'Recall' THEN 'Y' END) 
     AND a.IsDeleted   =0 
END 

========== Изменено это так. Является ли это совершенное ===========


(c.LastName + ' ' + c.Firstname) = (       
     CASE @PatientName       
      WHEN '' THEN (c.LastName + ' ' + c.Firstname)       
      ELSE '%' + @PatientName + '%'    
     END       
    ) 

ответ

0

Не используйте CASE WHEN в where clause. Используйте OR

(
    @PatientName = '' OR 
    (c.LastName + c.Firstname) LIKE '%' + @PatientName + '%' 
) AND 
(
    @User = '' OR 
    a.[User] LIKE '%' + @User + '%' 
) -- Same for others 

вместо

(c.LastName + ' ' + c.Firstname) = (       
     CASE @PatientName       
      WHEN '' THEN (c.LastName + ' ' + c.Firstname)       
      ELSE '%' + @PatientName + '%'    
     END       
    ) 
+0

Спасибо за предложение. Попробует. – user2859242

+0

Я просто приведу вам пример. Ты можешь измениться. – NEER

0

T-SQL имеет две формы CASE. Вы используете «Простой случай». Попробуйте "Обысканный Case" - например .:

CASE    
WHEN @PatientName = '' THEN [ return something ] 
WHEN @PatientName like [ pattern ] THEN [ return something ] 
ELSE [ return something else ] 
END 
+1

Названный 'Искал Дело' против 'Простой случай' – dfundako

+0

Спасибо - включил это в моем ответе. –

+0

Спасибо за предложение попытается реализовать. – user2859242