2013-06-21 7 views
9

के भीतर नल और खाली स्ट्रिंग को प्रतिस्थापित करना मेरे पास एक स्तंभ है जिसमें NULL या रिक्त स्थान (यानी '') मान हो सकते हैं। मैं उन दोनों मानों को 'UNKNOWN' जैसे वैध मान के साथ प्रतिस्थापित करना चाहता हूं। मैंने पाया है कि विभिन्न समाधान तालिका के भीतर मूल्य को संशोधित करने का सुझाव देते हैं। हालांकि, यह इस मामले में एक विकल्प नहीं है कि डेटाबेस तीसरे पक्ष के आवेदन के लिए है जो विकसित और/या बहुत खराब तरीके से पैच किया गया है (वास्तव में मुझे लगता है कि मेरा रोट्टवेयर बेहतर काम कर सकता था)। मुझे चिंता है कि अंतर्निहित डेटा को संशोधित करने से एप्लिकेशन धूम्रपान धूम्रपान में पिघल सकता है।चयन कथन

मैं निम्न कमांड के रूपांतरों का प्रयास किया है:

COALESCE(Address.COUNTRY, 'United States') -- Won't replace empty string as it is not NULL 
REPLACE(Address.COUNTRY, '', 'United States') -- Doesn't replace empty string 
ISNULL(Address.COUNTRY, 'United States') -- Works for NULL but not empty string 

मैं मैं CASE बयान इस्तेमाल कर सकते हैं पता है लेकिन उम्मीद वहाँ एक और अधिक सुरुचिपूर्ण/कुशल समाधान है हूँ।

जब आप कहते हैं कि मैंने अपने विशिष्ट मुद्दे के समाधान की तलाश की है और मुझे कोई जवाब नहीं मिला है तो आपको मेरा विश्वास करना होगा। अगर मैंने कुछ अनदेखा किया है, तो कृपया मुझे हल्का रास्ता दिखाएं।

उत्तर

46

इस

COALESCE(NULLIF(Address.COUNTRY,''), 'United States') 
+1

ऐसा लगता है कि ऐसा हुआ है। मेरे ऊपर बीयर है। हालांकि, मुझे आश्चर्य है कि यह काम करता है कि मेरी समझ यह है कि COALESCE फ़ंक्शन पहले गैर-शून्य मान को पकड़ लेगा। कथन में मैं पाठ स्ट्रिंग के विपरीत खाली स्थान वापस करने की अपेक्षा करता हूं ??? लेकिन, नीचे की रेखा, समाधान के लिए धन्यवाद। – mbadtk

+4

इस कथन में दो कार्य हैं, एक 'NULLIF' जो खाली स्ट्रिंग को शून्य में परिवर्तित कर रहा है और फिर' coalesce' जो शून्य –

+0

@rs के लिए जांचता है .: नोट: 'nullif' खाली स्ट्रिंग को शून्य में परिवर्तित नहीं करता है, यह लौटाता है शून्य अगर दो तर्क समान हैं;)। –

5

ऐसा लगता है कि आप के बजाय वास्तविक तालिका डेटा में फेरबदल के एक दृश्य चाहते हैं।

Coalesce(NullIf(rtrim(Address.Country),''),'United States') 

यह पता लगाएं कि क्या कोई रिक्त स्ट्रिंग (या खाली स्ट्रिंग) और फिर सम्मिलित साथ काम करने के एक अशक्त होगा अशक्त होने के लिए अपने कॉलम के लिए बाध्य करेगा।

+1

दोनों 'ltrim' और' rtrim' होने के कारण बेकार लगता है? यदि यह खाली है (रिक्त स्थान को छोड़कर) यह किसी भी तरफ से खाली है;) – Wolph

+1

@WoLpH ऐ, बहुत सच है। मैंने एक हटा दिया। (मुझे लगता है कि मैं बस आदत से दोनों लिखता हूं) – Brad

+1

एक दृश्य बनाना मेरे दिमाग को पार नहीं कर पाया था, हालांकि शायद यह होना चाहिए था। आरएस और आपकी विविधता ने एक पर्याप्त समाधान प्रदान किया ताकि देखने की कोई आवश्यकता न हो। – mbadtk

0

एक वैकल्पिक तरीका यह हो सकता है: - सिर्फ एक अभिव्यक्ति का उपयोग कर के रूप में सिफारिश -

case when address.country <> '' then address.country 
else 'United States' 
end as country 

नोट: null<> ऑपरेटर द्वारा जाँच false वापस आ जाएगी का परिणाम।
और दस्तावेज के रूप में: NULLIF is equivalent to a searched CASE expression
और COALESCE expression is a syntactic shortcut for the CASE expression
तो, उनमें से संयोजन case अभिव्यक्ति के दो समय का उपयोग कर रहे हैं।

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