এসকিউএল সার্ভার ২০০৮-এ "WHERE" ধারাটির মধ্যে "CASE" বিবৃতি


107

আমি একটি ক্যোয়ারির সাথে কাজ করছি যেখানে "WHERE" ধারাটির মধ্যে "CASE" বিবৃতি রয়েছে। কিন্তু এসকিউএল সার্ভার 2008 এটি কার্যকর করার সময় কিছু ত্রুটি দিচ্ছে। কেউ দয়া করে আমাকে সঠিক প্রশ্নের সাথে সাহায্য করতে পারেন? কোয়েরিটি এখানে:

SELECT
    tl.storenum 'Store #', 
    co.ccnum 'FuelFirst Card #', 
    co.dtentered 'Date Entered',
    CASE st.reasonid 
        WHEN 1 THEN 'Active' 
   WHEN 2 THEN 'Not Active' 
   WHEN 0 THEN st.ccstatustypename 
   ELSE 'Unknown' 
    END 'Status',
    CASE st.ccstatustypename 
        WHEN 'Active' THEN ' ' 
   WHEN 'Not Active' THEN ' ' 
   ELSE st.ccstatustypename 
    END 'Reason',
    UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) 'Person Entered',
    co.comments 'Comments or Notes'
FROM 
    comments co
    INNER JOIN cards cc ON co.ccnum=cc.ccnum
    INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
    INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
    INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
    INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
    LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
WHERE 
    CASE LEN('TestPerson')
        WHEN 0 THEN co.personentered  = co.personentered
   ELSE co.personentered LIKE '%TestPerson'
    END 
    AND cc.ccnum = CASE LEN('TestFFNum')
        WHEN 0 THEN cc.ccnum 
   ELSE 'TestFFNum' 
    END 
    AND CASE LEN('2011-01-09 11:56:29.327') 
        WHEN 0 THEN co.DTEntered = co.DTEntered 
   ELSE 
       CASE LEN('2012-01-09 11:56:29.327') 
           WHEN 0 THEN co.DTEntered >= '2011-01-09 11:56:29.327' 
      ELSE co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327' 
       END 
    END
    AND tl.storenum < 699 
ORDER BY tl.StoreNum

2
কেস অভিব্যক্তি , বিবৃতি না ... (কেস অভিব্যক্তি একটি মান ফেরায় ক্ষেত্রে বিবৃতি কোডের শর্তসাপেক্ষ সঞ্চালনের জন্য সংরক্ষিত পদ্ধতি ব্যবহার করা হয়।।)
jarlh

উত্তর:


205

প্রথমত, CASEবিবৃতিটি অবশ্যই প্রকাশের নয়, অভিব্যক্তির অংশ হতে হবে ।

অন্য কথায়, আপনি থাকতে পারেন:

WHERE co.DTEntered = CASE 
                          WHEN LEN('blah') = 0 
                               THEN co.DTEntered 
                          ELSE '2011-01-01' 
                     END 

তবে আপনি যেভাবে লিখেছেন সেভাবে এটি কাজ করবে না যেমন:

WHERE 
    CASE LEN('TestPerson')
        WHEN 0 THEN co.personentered  = co.personentered
   ELSE co.personentered LIKE '%TestPerson'
    END 

এই জাতীয় সম্মতিযুক্ত বিবৃতি ব্যবহার করে আপনার ভাগ্য ভাল হতে পারে:

WHERE (
        (LEN('TestPerson') = 0 
             AND co.personentered = co.personentered
        ) 
        OR 
        (LEN('TestPerson') <> 0 
             AND co.personentered LIKE '%TestPerson')
      )

যদিও, কোনও উপায়েই আমি নিশ্চিত নই যে আপনি কীভাবে কোনও ক্যোয়ারী পরিকল্পনা পাবেন। এই ধরণের শেনানিগান একটি WHEREক্লজে প্রায়শই ক্যোয়ারী অপ্টিমাইজারকে সূচকগুলি ব্যবহার থেকে বিরত রাখে।


1
যখন 0 তম co.Pressentered = co.Pressentered, এখানে এই চেক co.Pressentered = co.Pressentered প্রয়োজন হয় না কারণ এটি সর্বদা সত্য ফিরে আসবে এবং দৈর্ঘ্যের মান সর্বদা ধনাত্মক হবে। সুতরাং, এলইএন ('টেস্টপার্সন')> 0 তৈরি করা তুলনার তুলনায় প্রয়োজনীয় পরিসীমা হ্রাস করবে
সত্যজিৎ

co.personenteredবিকল্পটি 1 এবং 2 তে কীভাবে চেক করবেন তা বাতিল নয় Now এখন 3 ডি বিকল্প যথেষ্ট। তবে আমি তা জানতে চাই ... !!
পুগাল

আমি এ পর্যন্ত চেষ্টা করেছি where case c when 1 then (DescriptionCode is null) else descriptioncode is not null end, তবে আমি ত্রুটিটি Incorrect syntax near the keyword 'is'.
দেখাই

15

এটি আপাতত আপনার সমস্যার সমাধান করা উচিত তবে আপনাকে অবশ্যই মনে করিয়ে দিতে হবে এটি একটি ভাল পদ্ধতির নয়:

WHERE 
            CASE LEN('TestPerson')
                WHEN 0 THEN 
                        CASE WHEN co.personentered  = co.personentered THEN 1 ELSE 0 END
                ELSE 
                        CASE WHEN co.personentered LIKE '%TestPerson' THEN 1 ELSE 0 END
            END = 1
        AND cc.ccnum = CASE LEN('TestFFNum')
                            WHEN 0 THEN cc.ccnum 
                            ELSE 'TestFFNum' 
                       END 
        AND CASE LEN('2011-01-09 11:56:29.327') 
                WHEN 0 THEN CASE WHEN co.DTEntered = co.DTEntered THEN 1 ELSE 0 END 
                ELSE 
                    CASE LEN('2012-01-09 11:56:29.327') 
                        WHEN 0 THEN 
                            CASE WHEN co.DTEntered >= '2011-01-09 11:56:29.327' THEN 1 ELSE 0 END 
                        ELSE 
                            CASE WHEN co.DTEntered BETWEEN '2011-01-09 11:56:29.327' 
                                                        AND '2012-01-09 11:56:29.327' 
                                                     THEN 1 ELSE 0 END
                    END
            END = 1
        AND tl.storenum < 699 


6

আমি মনে করি যে আপনার ক্যোয়ারির শুরুটি দেখতে এমন হওয়া উচিত:

SELECT
    tl.storenum [Store #], 
    co.ccnum [FuelFirst Card #], 
    co.dtentered [Date Entered],
    CASE st.reasonid 
        WHEN 1 THEN 'Active' 
        WHEN 2 THEN 'Not Active' 
        WHEN 0 THEN st.ccstatustypename 
        ELSE 'Unknown' 
    END [Status],
    CASE st.ccstatustypename 
        WHEN 'Active' THEN ' ' 
        WHEN 'Not Active' THEN ' ' 
        ELSE st.ccstatustypename 
        END [Reason],
    UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) [Person Entered],
    co.comments [Comments or Notes]
FROM comments co
    INNER JOIN cards cc ON co.ccnum=cc.ccnum
    INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
    INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
    INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
    INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
    LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
WHERE 
    CASE 
      WHEN (LEN([TestPerson]) = 0 AND co.personentered  = co.personentered) OR (LEN([TestPerson]) <> 0 AND co.personentered LIKE '%'+TestPerson) THEN 1
      ELSE 0
      END = 1
    AND 

কিন্তু

লেজের মধ্যে যা রয়েছে তা সম্পূর্ণরূপে বোধগম্য নয়


4

WHEREঅংশটি এখানে লেখা যেতে পারে:

WHERE 
 (LEN('TestPerson') <> 0 OR co.personentered  = co.personentered) AND
 (LEN('TestPerson') = 0 OR co.personentered LIKE '%TestPerson') AND
 (cc.ccnum = CASE LEN('TestFFNum')
                WHEN 0 THEN cc.ccnum 
                ELSE 'TestFFNum' 
              END ) AND
 (LEN('2011-01-09 11:56:29.327') <> 0 OR co.DTEntered = co.DTEntered ) AND
 ((LEN('2011-01-09 11:56:29.327') = 0 AND LEN('2012-01-09 11:56:29.327') <> 0) OR co.DTEntered >= '2011-01-09 11:56:29.327'  ) AND
 ((LEN('2011-01-09 11:56:29.327') = 0 AND LEN('2012-01-09 11:56:29.327') = 0) OR co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327'  ) AND 
 tl.storenum < 699 

1

আপনি উদাহরণস্বরূপ নীচের মত চেষ্টা করতে পারেন। কেবল আউটবাউন্ড শিপমেন্টগুলি প্রদর্শন করতে

   SELECT shp_awb_no,shpr_ctry_cd, recvr_ctry_cd,
     CASE WHEN shpr_ctry_cd = record_ctry_cd 
     THEN "O" 
     ELSE "I" 
      END AS route
     FROM shipment_details
    WHERE record_ctry_cd = "JP"
      AND "O" = CASE WHEN shpr_ctry_cd = record_ctry_cd 
                THEN "O" 
                ELSE "I" 
                 END

1

এই প্রশ্নের জন্য ধন্যবাদ, আসলে আমি অন্য কিছু খুঁজছি যা নীচের প্রশ্নের মধ্যে রয়েছে। এটি কাউকে সাহায্য করতে পারে।

      SELECT DISTINCT CASE WHEN OPPORTUNITY='' THEN '(BLANK)' ELSE OPPORTUNITY END
  AS OPP,LEN(OPPORTUNITY) FROM [DBO].[TBL]

উপরের ক্যোয়ারীটি ড্রপডাউন পূরণ করা যা খালি মানগুলি "(ফাঁকা)" হিসাবে দেখায়। এছাড়াও যদি আমরা এই মানটি বর্গক্ষেত্রে পাস করি যেখানে অন্যান্য মানগুলির সাথে ফাঁকা মানগুলি পাওয়ার জন্য ধারাটি আমি কীভাবে এটি পরিচালনা করব তা জানি না। এবং অবশেষে নীচের সমাধান নিয়ে এসেছিল এটি কারওর পক্ষে সহায়তা করতে পারে।

এটা এখানে ,

 DECLARE @OPP TABLE (OPP VARCHAR(100))
  INSERT INTO @OPP VALUES('(BLANK)'),('UNFUNDED'),('FUNDED/NOT COMMITTED')
SELECT DISTINCT [OPPORTUNITY]
FROM [DBO].[TBL]   WHERE    (  CASE WHEN   OPPORTUNITY ='' THEN '(BLANK)' ELSE OPPORTUNITY END IN (SELECT OPP FROM @OPP))
ORDER BY 1 

0

এখানে আমার সমাধান

AND CLI.PE_NOM Like '%' + ISNULL(@NomClient, CLI.PE_NOM) + '%'

রেগাদস ডেভি


0

এইটা কাজ করে

declare @v int=A
select * from Table_Name where XYZ=202 
and 
dbkey=(case @v  when A then 'Some Value 1'
else 'Some Value 2'
end)

0
CASE LEN('TestPerson')
    WHEN 0 THEN co.personentered  = co.personentered ELSE co.personentered LIKE '%TestPerson'

নিম্নলিখিত চেষ্টা করুন:

... and ( 
    (LEN('TestPerson') = 0 and co.personentered  = co.personentered) or
    (LEN('TestPerson') <> 0 and co.personentered LIKE '%TestPerson') ) and ...

-1
select TUM1.userid,TUM1.first_name + ' ' +TUM1.last_name as NAME,tum1.Business_Title,TUM1.manager_id,tum2.First_Name + ' ' + tum2.Last_Name as [MANAGER NAME],TUM1.project,TUM1.project_code,TUM1.rcc_code,TUM1.department,TCM.Company_Name,
case 
when tum1.Gender_ID=1 then 'male' 
else 'female' 
end 'GENDER'
,tum1.Band as BAND,
case when tum1.Inactive=0 then 'STILL IN COMPANY'
else 'LEFT COMPANY' 
end 'ACTIVE/INACTIVE'
from tbl_user_master TUM1
join tbl_Company_Master TCM on TCM.Company_Code=TUM1.Company_Code 
join tbl_User_Master TUM2 on TUM1.Manager_ID=TUM2.UserID 
where tum1.UserID in ('54545414')

-3
SELECT * from TABLE 
              WHERE 1 = CASE when TABLE.col = 100 then 1 
                     when TABLE.col = 200 then 2 else 3 END 
                  and TABLE.col2 = 'myname';

এইভাবে ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.