2012-12-05 11 views
5

मैं एक (माइक्रोसॉफ्ट) एसक्यूएल सर्वर 2008 तालिका पर एक बाधा उत्पन्न कर रहा हूं। मेरे पास दो कॉलम हैं जो अलग-अलग डेटाटाइप हैं। एक कॉलम हर समय शून्य होना चाहिए, लेकिन दोनों नहीं (एक तार्किक अनन्य OR/XOR)। मेरे पास वर्तमान में एक कार्यशील अभिव्यक्ति है।एसक्यूएल सर्वर नल लॉजिकल एक्सओआर

(@a is null or @b is null) and not (@a is null and @b is null) 

मेरा प्रश्न है वहाँ एक क्लीनर या इस कोड को लिखने के लिए कम रास्ता नहीं है? एक

यह परीक्षण करने के लिए आप इस कोड का उपयोग कर सकते हैं ...

declare @a int 
declare @b varchar(5) 

set @a=1 
set @b='XXXXX' 

if (@a is null or @b is null) and not (@a is null and @b is null) 
    select 'pass' 
else 
    select 'fail' 
+0

यह माइक्रोसॉफ्ट एसक्यूएल सर्वर है, postgresql नहीं। वाक्यविन्यास "! =" का समर्थन नहीं करता है। –

उत्तर

5

मैं

if (@a is null and @b is not null) or (@a is not null and @b is null) 

पसंद करेंगे यह थोड़ा मेरी राय में स्पष्ट

+0

मुझे लगभग 30 सेकंड तक लगभग समान पोस्ट पर मारो। ;-) – Mark

+0

@SQLMenace +1। डाउनवॉटिंग के बिना मेरी गलती को इंगित करने के लिए धन्यवाद। – Kaf

2

ठीक है, यहाँ है (हालांकि बेवकूफ) सुझाव अगर आप सभी तारों के साथ काम कर रहे हैं। और यह 2 से अधिक गुणकों के लिए स्केल करता है जहां आप एक विशेष संख्या में गैर-नल की आवश्यकता होती है। फिर, अपने बेवकूफ और वास्तव में छोटे, लेकिन यह बहुत मजेदार था उल्लेख ऊपर पारित करने के लिए ...

where LEN(ISNULL(right(@a+'x',1),'')+ISNULL(right(@b+'x',1),'')) = 1 

यह अपना सामान के साथ काम करने के लिए, आप कास्ट करना [int] होगा, मुझे लगता है। मिलान से पहले खंड जहां स्ट्रिंग "सर्जरी" करना बुरा है और वास्तविक धीमी होने के लिए उत्तरदायी है। लेकिन अगर आपके पास 6 कॉलम थे और वास्तव में 1 की आवश्यकता नहीं थी तो यह चाल स्केल हो जाएगी।

असल में, हम नॉन-गल्स की गणना करने के लिए LEN का उपयोग कर रहे हैं। +'x' सुनिश्चित करता है कि आप '' को शून्य के रूप में नहीं मानते हैं। [Char] स्तंभों का परीक्षण करते समय आप इसे छोड़ सकते हैं।

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