2016-07-26 7 views
-1

Bei Verwendung CASE Anweisung mit LIKE Betreiber stecken geblieben. In der unten gespeicherten Prozedur sind alle Parameter nicht verpflichtend. Wenn Benutzer also PatientName nicht zur Suche eingibt, gibt die folgende Abfrage keine erwarteten Ergebnisse zurück, da sich der LIKE-Operator außerhalb befindet, was offensichtlich ist. Ich suche nach etwas, wie so dass, wenn Benutzer PatientName nicht betreten wird esFall mit Like-Operator

sein
(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 

========== Changed Like this. Das ist perfekt ===========


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

Antwort

0

nicht CASE WHEN in where clause anwenden. Verwenden OR

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

statt

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

Danke für den Vorschlag. Werde es versuchen. – user2859242

+0

Ich gebe Ihnen nur ein Beispiel. Du kannst ändern. – NEER

0

T-SQL zwei Formen von CASE hat. Sie verwenden "Einfacher Fall". Versuchen Sie "gesuchter Fall" - z.B .:

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

Called 'gesuchter Fall' vs 'Simple Fall' – dfundako

+0

Dank - enthalten diese in meiner Antwort. –

+0

Danke für den Vorschlag wird versuchen zu implementieren. – user2859242