2011-10-27 15 views
7

में किया जा सकता है मेरे पास एक प्रोजेक्ट है जो SQL सर्वर या एमएस एक्सेस को डेटा स्टोर के रूप में उपयोग कर सकता है। एक का चयन करें बयान में मैं एक COALESCE आपरेशन एकल स्तंभ और एक ही मूल्य पर, इस तरह प्रदर्शन करना होगा:COALESCE, IFNULL, या NZ() फ़ंक्शन जिसका उपयोग SQL सर्वर और एमएस एक्सेस

SELECT COALESCE([Amount], 0) FROM PaymentsDue; 

मैं एक एकल एसक्यूएल बयान है कि दोनों एसक्यूएल सर्वर और एमएस एक्सेस में सही ढंग से निष्पादित करेगा लिखने के लिए चाहते हैं । SQL सर्वर संस्करण जो तत्काल ब्याज का है 2008 है, हालांकि संस्करणों पर लागू एक समाधान को प्राथमिकता दी जाएगी।

इससे पहले, कोई व्यक्ति to show me an SQL trick सक्षम था जिसने मुझे दिनांक में एक डेटाटाइम प्रभावी रूप से CASTIME करने के लिए एक एकल चयन कथन का उपयोग करने की अनुमति दी। मैं सोच रहा था कि क्या किसी के पास एक COALESCE (उदाहरण के लिए, IFNULL या NZ) ऑपरेशन करने के लिए एक समान चाल है जिस पर SQL सर्वर और एमएस एक्सेस दोनों पर लागू किया जा सकता है?

उत्तर

6

यह काम करेंगे, लेकिन यह भद्दा है:

SELECT Amount 
FROM PaymentsDue 
WHERE Amount IS NOT NULL 
UNION ALL 
SELECT 0 AS Amount 
FROM PaymentsDue 
WHERE Amount IS NULL 

जाहिर है अगर आप एक से अधिक स्तंभ है, यह जल्दी से अनियंत्रित होने के लिए हो जाता है।

+1

'राशि = 0' भाग एक्सेस में काम नहीं करेगा। यह '0 एएस राशि 'होना चाहिए। –

+0

मैं इस समाधान के एक संस्करण के साथ चला गया। मेरी तत्काल आवश्यकता एक 'INSERT करने के लिए है। । । चुनते हैं। । । और मैं बस दो बार कथन दोहराता हूं, एक बार एनयूएलएल के लिए और एक बार अन्य पंक्तियों के लिए। –

5

मुझे नहीं लगता कि कोई वाक्यविन्यास है जो दोनों प्लेटफार्मों पर समान कार्य करता है।

नोट Nz() केवल एक्सेस उपयोगकर्ता इंटरफ़ेस का उपयोग करते समय उपलब्ध है।

यहाँ, कुछ सुझाव है कि काफी आसानी से COALESCE को तब्दील किया जा सकता है, हालांकि स्तंभ दोहरा एक दर्द है:

नमूना 1:

SELECT IIF([Amount] IS NULL, 0, [Amount]) FROM PaymentsDue; 

नमूना 2:

SELECT SWITCH([Amount] IS NULL, 0, TRUE, [Amount]) FROM PaymentsDue; 
0

और मुझे लगता है कि आप एक पार्सर नहीं लिखना चाहते हैं जो जेट एसक्यूएल और टी-एसक्यूएल के बीच अनुवाद प्रबंधित करेगा ...

एक समाधान जिसे हमने विकसित किया (हां, हमें हल करने के लिए एक ही समस्या थी) कुछ 'छद्म-धातुभाषा' को परिभाषित करना है जिसे हम अपने मेटा-एसक्यूएल सिंटैक्स में उपयोग करते हैं, और हमारे पास इस मेटा-भाषा से एक प्रकार का अनुवादक है जेट एसक्यूएल या टी-एसक्यूएल में।

उदाहरण:

myQuery = "SELECT @[email protected]([Amount], 0) FROM PaymentsDue;" 

myQuery = convertFromMeta(myQuery,"T-SQL") 
will give 
    "SELECT COALESCE([Amount], 0) FROM PaymentsDue;" 

myQuery = convertFromMeta(myQuery,"JET-SQL") 
will give 
    "SELECT NZ([Amount], 0) FROM PaymentsDue;" 

एक ही रणनीति वाइल्डकार्ड और सीमांकक के लिए इस्तेमाल किया जा सकता:

myQuery = "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE @[email protected]@[email protected]@[email protected]" 

myQuery = convertFromMeta(myQuery,"T-SQL") 
will give 
    "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE 'ABC%'" 

myQuery = convertFromMeta(myQuery,"JET-SQL") 
will give 
    "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE "ABC%"" 

मैं जानता यह है कि अच्छा नहीं है, लेकिन यह काफी कुशल और साफ है। मुख्य बिंदु हैं:

  • हम जेट और टी-एसक्यूएल के बीच अनुवाद नहीं कर रहे हैं, लेकिन 'मेटा-सिंटैक्स' से। यह चीजों को बहुत आसान बनाता है
  • किसी को बहुत सावधान रहना चाहिए जब कार्यों में पैरामीटर की संख्या न हो, या जब पैरामीटर एक ही क्रम में पास नहीं होते हैं। यह अभी भी किया जा सकता है ...
  • हमारा मेटा-सिंटैक्स इस तथ्य पर निर्भर करता है कि संबंधित तार (जैसे '@ MyWildCard @' या '@ CarSep @') हमारे वाक्यविन्यास के लिए विशिष्ट हैं, और डेटा मानों के रूप में उपयोग नहीं किए जा सकते हैं (अन्यथा हमें कुछ 'मेटा-इंजेक्शन' जोखिमों का प्रबंधन करना होगा! ...)
+0

आप सही हैं कि मैं अपना खुद का पार्सर नहीं लिखना चाहता! मैंने आपके स्वयं के * जनरेटर * लिखने के बारे में सोचा है, हालांकि, आपने जो सुझाव दिया है उसके आधार पर (लेकिन तारों की बजाय वस्तुओं पर परिचालन करना)। मेरे आवेदन के दूसरे हिस्से में मैं डेटाबेस में नई सुविधाओं को जोड़ने के लिए डीडीएल जारी करता हूं जो इंजन के लिए विशिष्ट होना चाहिए; जो जनरेटर का उपयोग करने (और तुलनात्मक रूप से आसान) से लाभान्वित होगा। अगर मैंने ऐसा किया, तो मैं प्रत्येक इंजन के लिए अलग-अलग विचारों में अपने चयन तर्क को समाहित कर सकता था। लेकिन यह भविष्य में है, अभी मैं इस विशेष समस्या को संभालने के लिए एक त्वरित "चाल" की तलाश में हूं। –

3

मॉड्यूल में एक कस्टम सार्वजनिक फ़ंक्शन बनाएं।

Public Function COALESCE(InputValue, ValueIfNull) 
    COALESCE = nz(InputValue, ValueIfNull) 
End Function 

त्रुटि प्रबंधन में जोड़ें, आदि, सुधार करें।

अब, आप एमएस एक्सेस और एसक्यूएल में COALESCE फ़ंक्शन का उपयोग करने में सक्षम होंगे।

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

  • कोई संबंधित समस्या नहीं^_^