2012-01-09 8 views
73

में "WHERE" खंड के भीतर "केस" कथन, मैं एक प्रश्न के साथ काम कर रहा हूं जिसमें "WHERE" खंड के भीतर "केस" कथन शामिल है। लेकिन SQL सर्वर 2008 इसे निष्पादित करते समय कुछ त्रुटियां दे रहा है। क्या कोई मुझे सही क्वेरी के साथ मदद कर सकता है? क्वेरी है:SQL सर्वर 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 

उत्तर

146

पहले, 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 

बेहतर होगा कि तुम भाग्य की तरह संयुक्त OR कथन का उपयोग कर हो सकता है यह:

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

हालांकि, किसी भी तरह से मुझे यकीन नहीं है कि आपको एक प्रश्न योजना कितनी अच्छी होगी। WHERE खंड में इन प्रकार के शेन्ज़िगन्स अक्सर क्वेरी ऑप्टिमाइज़र को इंडेक्स का उपयोग करने से रोक देंगे।

+1

जब 0 फिर सह पी ersonentered = co.personentered, यहां यह जांच co.personentered = co.personentered की आवश्यकता नहीं है क्योंकि यह हमेशा सत्य लौटाएगा और लंबाई मान हमेशा सकारात्मक रहेगा। इसलिए, एलईएन ('टेस्टपर्सन')> 0 को तुलना करने के लिए आवश्यक सीमा को कम कर देगा – Satyajit

5

मुझे लगता है कि आपकी क्वेरी की शुरुआत है कि तरह दिखना चाहिए:

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 

लेकिन

क्या पूंछ में है पूरी तरह से समझ में आता नहीं है

12

इस के लिए अपनी समस्या को हल करना चाहिए समय है लेकिन मुझे आपको याद दिलाना चाहिए कि यह एक अच्छा दृष्टिकोण नहीं है:

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 
-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') 
10

निम्नलिखित का प्रयास करें:

इस तरह से
select * From emp_master 
where emp_last_name= 
case emp_first_name 
when 'test' then 'test' 
when 'Mr name' then 'name' 
end 
-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'; 

का प्रयोग करें।

2

वहाँ 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 
0

यहां मेरे समाधान

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

regads है डेवी

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)