2009-01-05 10 views
7

मैं कहां खंड यहाँ के अंदर मामला अभिव्यक्ति का उपयोग कर के बारे में पढ़ा मामला अभिव्यक्ति:एसक्यूएल अंदर कहां

http://scottelkin.com/sql/using-a-case-statement-in-a-sql-where-clause/

मैं यह मेरा चयन बयान से परिणामों को फ़िल्टर करने, एक अनुबंध के आधार पर उपयोग करने के लिए कोशिश कर रहा हूँ संख्या जो उपयोगकर्ता के आवेदन द्वारा पारित की जाएगी। मेरा कोड वर्तमान में 'अमान्य पैरामीटर' की एक त्रुटि फेंकता है चाहे कोई भी गुजरता है। मैंने सत्यापित किया है कि चयन/ठीक काम कर रहे हैं, जहां एक केस अभिव्यक्ति के बिना WHERE क्लॉज के रूप में। मेरा कोड यहाँ है।

WHERE  (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END = 
tblContracts.ContractNo) 

कोड का अतिरेक मैं बाद में इस मामले पर वाइल्डकार्ड छानने के प्रयोग पर योजना बना रहा हूँ, समस्याएं दूर करने के लिए है। मैं अभी वाक्यविन्यास प्राप्त करने पर ध्यान केंद्रित कर रहा हूं। मेरा मानना ​​है कि यह उन सभी रिकॉर्ड्स को वापस कर देना चाहिए जिनके लिए पैरामीटर तालिका में संग्रहीत अनुबंध संख्या से मेल खाता है। कोई भी मदद या सलाह बहुत सराहनीय होगी।

उत्तर

7

अपने स्पष्टीकरण पढ़ने के बाद, वहाँ CASE बिना यह करने के लिए एक बेहतर तरीका है:

WHERE @ContractNo = 0 OR tblContracts.ContractNo = @ContractNo 

यह केवल मिलान अनुबंध संख्या वापस आ जाएगी, जब तक @ContractNo 0 है, जिस स्थिति में यह सभी रिकॉर्ड वापस आ जाएगी।

संपादित करें: मैंने अभी देखा है कि casperOne proposed the same thing। मैंने उसे नहीं देखा। खुद को बड़ा करो।

+0

बहुत बहुत धन्यवाद! इससे बहुत मदद मिली –

+0

चूंकि रिकर्सिव आपकी समस्या का समाधान कर रहा है, इसलिए आपको बड़े हरे रंग के चेकबॉक्स के साथ अपना जवाब "स्वीकार" करना चाहिए। – JosephStyons

2

वांछित जगहों पर मौजूद कोष्ठक छोड़ने का प्रयास करें - सही "END" के बाद होना चाहिए।

+0

माता-पिता मेरे लिए ठीक लग रहे हैं। यह चर के बारे में शिकायत कर रहा है। –

+0

वास्तव में यह पैरामीटर के बारे में शिकायत कर रहा है, एक चर नहीं। लेकिन आप सही हैं, यह एक अनुचित सेट पैरामीटर मान हो सकता है। – dkretz

1

तो जैसे = से पहले करने के लिए अपने पास कोष्ठक ले जाएँ:

WHERE  (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END)=tblContracts.ContractNo 

मैं देखना क्या इस मामले बयान हालांकि ... आप घटना @ContractNo = में एक ही बात के लिए लौट रहे हो जाएगा असफल 0 या अगर यह नहीं है ...

सही सिंटैक्स है:

Select... 
    ... 
    Where(
    Case 
     When <Condition> 
     Then <Return if true> 
     Else <Return if false> 
     End 
) = <Whatever is being matched to the output of the case statement> 

वाक्य रचना के बावजूद हालांकि, अपने उदाहरण, भावना का एक बहुत नहीं है आप सभी आइटम के लिए देख रहे हैं कि matc ज या एक अनुबंध 0 की संख्या है, तो आप क्या करेंगे:

Select... 
... 
Where (
    @ContractNo = 0 Or 
    @ContractNo = tblContracts.ContractNo 
) 

आपके मामले में ऐसा बयान का उपयोग करने के लिए प्रयास कर रहे हैं क्या तुलना में कहीं अधिक समझ बनाने के लिए लगता है कौन सा।

संपादित करें: मुझे थोड़ा प्रश्न गलत तरीके से गलत करना होगा - गायब पर्म आमतौर पर इसका मतलब है कि पैरामीटर (इस मामले में @ContractNo) आपकी क्वेरी/प्रक्रिया के दायरे में घोषित नहीं किया गया है। लेकिन किसी ने पहले से ही बताया है, इसलिए मैं इसके लिए कोई क्रेडिट नहीं ले सकता।

+0

सरल केस और खोजे गए केस के बीच अंतर। यहां और पढ़ें: http://msdn.microsoft.com/en-us/library/ms181765.aspx –

+0

@ डेविड बी: मुझे कहीं आपकी जगह याद आ रही है। प्रश्न की स्पष्टता की कमी को देखते हुए, आप कैसे तय करते हैं कि सही क्या है? – BenAlabaster

+0

हाँ, आप सही हैं। प्रश्न में स्पष्टता की कमी है (इसीलिए मैंने अभी तक इसका उत्तर नहीं दिया है)। हालांकि उनके लिंक और उनके कोड "खोजे गए केस" दिखाते हैं और आपका वाक्यविन्यास उदाहरण "सरल मामला" दिखाता है। –

0

क्या आपको ऐसा कुछ मतलब नहीं है?

SELECT * 
    FROM tblContracts 
    WHERE  
    CASE 
     WHEN tblContracts.ContractNo = 0 THEN @ContractNo 
     ELSE tblContracts.ContractNo 
    END = tblContracts.ContractNo 

कहाँ @ContractNo tblContracts.ContractNo रूप में एक ही डेटाप्रकार

9

क्या आप वाकई ऐसा करना चाहते हैं की चर रहा है? आपका केस स्टेटमेंट हमेशा @ContractNo देता है। मुझे लगता है कि आप देख रहे हैं यह है:

where 
    case @ContractNo 
     when 0 then tblContracts.ContractNo 
     else @ContractNo 
    end = tblContracts.ContractNo 

फिल्टर ऊपर कहते हैं, "मुझे अनुबंध जहां ContractNo पैरामीटर के बराबर होती है, या उन सभी को देना है, तो पैरामीटर 0.

पिछले फिल्टर है केवल फ़िल्टर किया गया जहां अनुबंध संख्या फ़ील्ड पैरामीटर के बराबर बराबर है।

परवाह किए बिना, आप इस के बजाय करना चाहिए:

where @ContractNo = 0 or @ContractNo = tblContracts.ContractNo 

तर्क बहुत समझना आसान है, और उस की चोटी पर (इस पर मुझे बोली नहीं है), अनुकूलक शायद बेहतर के बाहर काम करेंगे केस स्टेटमेंट

+0

मैं जो भी कह रहा था उसे गलत तरीके से बताता हूं, इसके बारे में खेद है। –

0

आपको केस स्टेटमेंट की आवश्यकता क्यों है?

जब @ContractNo = 0 तो (0 = tblContracts.ContractNo) और @ContractNo तो (@ContractNo = tblContracts.ContractNo)

यह कोई मतलब नहीं है क्योंकि आप बस

कहाँ के रूप में लिख सकते बनाता है @contractNo = tblContracts.contractNo

2

शायद आप @ContractNo घोषित करना भूल गए हैं? क्या यह 0 से तुलनीय है और tblContracts.Contract नहीं?

0

क्या अनुबंध संख्या वास्तव में एक संख्यात्मक है या यह एक स्ट्रिंग है जो हमेशा एक संख्यात्मक होती है। मेज और पैरामीटर और मामला बयान (उदाहरण के लिए, "= 0" या "= '0' ')

+0

अनुबंध नहीं एक स्ट्रिंग है, यह एक गलती है। जब मैंने कोशिश की "मुझे लगता है कि @ContractNo = 'All'" की कोशिश करने से पहले मुझे वही समस्या आई थी। –

1

मामले बयान, पूरे सहित" यदि यह 0 है, देने के लिए कारण के बीच अपने डेटा प्रकार की जाँच करें पैरामीटर, और अन्यथा, पैरामीटर दें "सिंटैक्स सही प्राप्त करने का प्रयास करने के लिए इसका परीक्षण करना था। मूल रूप से, मैंने यह कहने की कोशिश की थी कि "यदि यह 0 है, तो प्रत्येक मान वापस करने के लिए '%' में पास करें। मैंने जिस कोड में पोस्ट किया था, वह इसलिए था क्योंकि मुझे 'अमान्य पैरामीटर' मिल रहा था और मुझे लगा कि मेरे वाक्यविन्यास में कुछ गलत होना चाहिए। मैं यह तो जैसे बुनियादी पैरामीटर मिलान में विभाजित,

WHERE @ContractNo = tblContracts.ContractNo 

यह ठीक रिकॉर्ड लौट आए। मुझे थोड़ा अधिक समझाता हूँ।

मैं अलग-अलग तालिकाओं का एक समूह से खींच रहा हूँ, और जानकारी के साथ सामग्री को छानने चयन कथन में शामिल नहीं है (यानी tblContracts में चयन से इसे खींचने वाली जानकारी नहीं है, इसका उपयोग केवल कहां किया जाता है)। उपयोगकर्ता कॉम्बो बॉक्स से चयन करेगा जिसमें अलग-अलग अनुबंध संख्याएं होंगी, साथ ही साथ डिफ़ॉल्ट मान भी होगा के सभी'।

मैं कॉम्बो बॉक्स की अनुक्रमणिका में परिवर्तन के लिए एक घटना होने जा रहा हूं। यदि यह 'ऑल' है, तो 0 को पैरामीटर के रूप में पास किया जाएगा और मुझे कोई फ़िल्टरिंग नहीं करना चाहिए। अन्यथा, मैं सिर्फ उस अनुबंध संख्या की जानकारी चाहता हूं (अन्यथा @ContractNo का कारण)।

1

रिकर्सिव पोस्ट ने मेरी समस्या को ठीक से हल किया।

मैंने अपनी मूल पोस्ट की स्पष्टता के बारे में शिकायतें देखीं। भविष्य में, मैं जो कुछ और कह रहा हूं उसे बनाने के लिए मैं क्या कर सकता हूं? मुझे कोड के बारे में प्रश्नों को phrasing करने के लिए उपयोग नहीं किया जाता है, और किसी भी गड़बड़ चीजों के लिए माफ़ी मांगना। क्या मुझे सिर्फ अपनी दूसरी पोस्ट में विस्तारित विवरण प्रदान करने की आवश्यकता है?

सभी मदद के लिए धन्यवाद।

+0

अपने कथन में लाइन ब्रेक जोड़ें, इसलिए इसे – EvilTeach

+0

स्क्रॉल किए बिना पढ़ा जा सकता है एक बात के लिए, आपको इसे अतिरिक्त समाधान के रूप में पोस्ट करने के बजाय, मूल प्रश्न में एक संपादन के रूप में अपना अपडेट शामिल करना चाहिए। प्रश्न के लिए, एक उदाहरण कोड का उपयोग करना बेहतर होगा जो कुछ भी कम नहीं करता है, और/या कहें कि आपका अंतिम लक्ष्य मूल पोस्ट में क्या था। – recursive

+0

और ओह हाँ, अगर मेरा समाधान आपकी समस्या का समाधान करने वाला था, तो आपको इसे स्वीकार कर लिया जाना चाहिए, इसे स्वीकार्य समाधान के रूप में चिह्नित करना चाहिए। – recursive

0

इस वाक्य रचना काम करना चाहिए (यह Oracle में करता है)

WHERE CASE WHEN tblContracts.ContractNo = 0 
      THEN @ContractNo 
      ELSE tblContracts.ContractNo 
     END = tblContracts.ContractNo 
0

आप जब कहते हैं:

मैं अलग-अलग तालिकाओं का एक समूह से खींच रहा हूँ, और जानकारी के साथ सामग्री को छानने शामिल नहीं चुनिंदा वक्तव्य में (यानी टीबीएलकंट्रैक्ट्स में चयन से इसे खींचने वाली जानकारी नहीं है, इसका उपयोग केवल कहां किया जाता है)। उपयोगकर्ता एक कॉम्बो बॉक्स से चयन करेगा जिसमें अलग-अलग अनुबंध संख्याएं होंगी, साथ ही साथ 'ऑल' का डिफ़ॉल्ट मान भी होगा।

तब मुझे लगता है कि "जहां मौजूद है" खंड होना चाहिए। चूंकि आप उस टेबल से कोई जानकारी नहीं खींच रहे हैं ?!

संबंधित मुद्दे