"खाली या शून्य मान" के लिए जाँच करने का सबसे अच्छा तरीका


176

पोस्टग्रेज एसक्यूएल स्टेटमेंट में मान शून्य या खाली स्ट्रिंग है या नहीं, यह जांचने का सबसे अच्छा तरीका क्या है?

मूल्य लंबी अभिव्यक्ति हो सकती है इसलिए यह बेहतर है कि यह केवल एक बार जांच में लिखा जाए।

वर्तमान में मैं उपयोग कर रहा हूं:

coalesce( trim(stringexpression),'')=''

लेकिन यह थोड़ा बदसूरत लगता है।

stringexpressionchar(n)कॉलम या अभिव्यक्ति हो सकती है जिसमें char(n)अनुगामी रिक्त स्थान वाले कॉलम हों।

सबसे अच्छा तरीका क्या है?


3
charपैडिंग (और परिणामस्वरूप अंतरिक्ष अपशिष्ट) के कारण उपयोग करना लगभग हमेशा गलत विकल्प होता है। लेकिन इसके अलावा: मुझे नहीं लगता कि एक बेहतर समाधान है।
a_horse_with_no_name

कुरूप क्यों? तार्किक और सुपाठ्य।
क्लिन

1
@a_horse_with_no_name: मुझे लगता है कि वहाँ है।
एरविन ब्रान्डेसटेटर

जवाबों:


283

अभिव्यक्ति की stringexpression = ''पैदावार:

TRUE   .. ''(या किसी भी स्ट्रिंग के लिए डेटा प्रकार के साथ केवल रिक्त स्थान से मिलकर char(n))
NULL   .. के लिए NULL
FALSE .. और कुछ के लिए

तो इसके लिए जाँच करें: " stringexpressionया तो NULL या खाली है" :

(stringexpression = '') IS NOT FALSE

या रिवर्स दृष्टिकोण (पढ़ने में आसान हो सकता है):

(stringexpression <> '') IS NOT TRUE

सहित किसी भी वर्ण प्रकार के लिए काम करता है char(n)तुलना ऑपरेटरों के बारे में मैनुअल।

या बिना अपनी मूल अभिव्यक्ति का उपयोग करें trim(), जो char(n)(नीचे देखें) के लिए महंगा शोर है , या अन्य चरित्र प्रकारों के लिए गलत है: केवल रिक्त स्थान से मिलकर तार खाली स्ट्रिंग के रूप में गुजरेंगे।

coalesce(stringexpression, '') = ''

लेकिन सबसे ऊपर के भाव तेज हैं।

विपरीत करना और भी सरल है: " stringexpressionन तो NULL है और न ही खाली है" :

stringexpression <> ''

के बारे में char(n)

यह डेटा प्रकार के बारे में है char(n), छोटे के लिए: character(n)। ( char/ characterके लिए कम कर रहे हैं char(1)/ character(1)।) इसका उपयोग किया जाता है Postgres में हतोत्साहित किया :

ज्यादातर स्थितियों में textया character varyingइसके बजाय इस्तेमाल किया जाना चाहिए।

भ्रमित न char(n)अन्य, उपयोगी, चरित्र प्रकार के साथ varchar(n), varchar, textया"char" (डबल कोट्स के साथ)।

में char(n)एक खाली स्ट्रिंग किसी अन्य केवल रिक्त स्थान से मिलकर स्ट्रिंग से अलग नहीं है। ये सभी प्रकार की प्रति परिभाषा में n रिक्त स्थान पर मुड़े हुए हैं char(n)। यह तार्किक रूप से अनुसरण करता है कि उपरोक्त अभिव्यक्तियाँ और char(n)साथ ही काम करती हैं - बस ये जितना (जो अन्य वर्ण प्रकारों के लिए काम नहीं करेगा):

coalesce(stringexpression, '  ') = '  '
coalesce(stringexpression, '') = '       '

डेमो

खाली स्ट्रिंग रिक्त स्थान के किसी भी स्ट्रिंग के बराबर होती है जब char(n):

SELECT ''::char(5) = ''::char(5)     AS eq1
     , ''::char(5) = '  '::char(5)   AS eq2
     , ''::char(5) = '    '::char(5) AS eq3;

परिणाम:

 eq1 | eq2 | eq3
 ----+-----+----
 t   | t   | t

"Null या खाली स्ट्रिंग" के लिए टेस्ट करें char(n):

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::char(5))
   , ('')
   , ('   ')                -- not different from '' in char(n)
   , (NULL)
   ) sub(stringexpression);

परिणाम:

stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
 फू | च | च | च | च | च | च
                  | टी | टी | टी | टी | टी | टी
                  | टी | टी | टी | टी | टी | टी
 नल              | नल       | टी | टी | टी | टी | टी

"Null या खाली स्ट्रिंग" के लिए टेस्ट करें text:

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::text)
   , ('')
   , ('   ')                -- different from '' in a sane character types
   , (NULL)
   ) sub(stringexpression);

परिणाम:

stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
 फू | च | च | च | च | च | च
                  | टी | टी | टी | टी | च | च
                  | च | च | च | च | च | च
 नल              | नल       | टी | टी | टी | टी | च

db <> फिडेल यहाँ
पुरानी sqlfiddle

सम्बंधित:


2
@a_horse_with_no_name: ओपी के लिए पूछता है best way to check if value is null or empty stringtrim()और सिर्फ आवश्यक नहीं - कॉल (अपेक्षाकृत) महंगा है। मैंने char(n)"खाली स्ट्रिंग" के बारे में और अधिक जोड़ा ।
एरविन ब्रान्डेसटेटर

1
आपने लिखा है कि केवल रिक्त स्थान वाले किसी भी स्ट्रिंग अभिव्यक्ति के बराबर है ''। क्या मैं ट्रिम निकाल सकता हूं और coalesce(stringexpression,'')=''जांच के लिए उपयोग कर सकता हूं । यह आपके उत्तर की तुलना में मेरे लिए अधिक पठनीय लगता है।
एंड्रस

1
@Andrus: हाँ, आप कर सकते हैं। मैंने कहा कि और उत्तर के लिए कुछ और।
एरविन ब्रान्डेसटेटर

3
select coalesce(' ', '') = '' झूठा लौटता है। तो TRIM () की आवश्यकता है
Andrus

1
लेकिन coalesce(' '::char(5), '') = ''नहीं करता है। मैं किसी भी मामले में शीर्ष दो अभिव्यक्तियों में से एक का उपयोग करूंगा, जो किसी भी वर्ण प्रकार के लिए काम करते हैं और सबसे तेज़ और सबसे साफ हैं।
एरविन ब्रान्डेसटेटर

46

अशक्त और खाली की जाँच करने के लिए:

coalesce(string, '') = ''

रिक्त, रिक्त और रिक्त स्थान की जांच करने के लिए (स्ट्रिंग को ट्रिम करें)

coalesce(TRIM(string), '') = ''

3
मुझे इस उत्तर की सरलता / स्पष्टता पसंद है।
stwr667

12

स्ट्रिंग की लंबाई के लिए जाँच करना भी काम करता है और कॉम्पैक्ट है:

where length(stringexpression) > 0;

क्या आपने NULL केस के लिए इसकी जाँच की?
फ्लिंच

1
हाँ, मैंने किया। यह न तो खाली लौटता है और न ही स्ट्रिंग स्ट्रिंग फ़ील्ड।
यगलोद

यदि आपको केवल खाली मूल्यों की जांच करने की आवश्यकता है, तो यह प्रयास करें -> where length(stringexpression) = 0;। यह मेरे लिए काम करता है।
कुषाण गुनासेकरा

2

यदि रिक्त स्थान खाली हो सकते हैं, तो बेहतर समाधान नहीं है। COALESCEसिर्फ तुम्हारी जैसी समस्याओं के लिए है।


1

कुछ ऐसा जो मैंने देखा कि लोग इसका उपयोग कर रहे हैं stringexpression > '' । यह सबसे तेज एक नहीं हो सकता है, लेकिन सबसे कम में से एक होने के लिए होता है।

इसे MS SQL के साथ-साथ PostgreSQL पर भी आज़माया।



0

अशक्त क्षेत्रों की तुलना करने के लिए मेरा प्रचलित तरीका है: NULLIF (nullablefield,: ParameterValue) IS NULL AND NULLIF (: ParameterValue, nullablefield) IS NULL। यह बोझिल है लेकिन सार्वभौमिक उपयोग का है जबकि कुछ मामलों में कोलेसस असंभव है।

NULLIF का दूसरा और उलटा उपयोग है क्योंकि "NULLIF (nullablefield,: ParameterValue) IS NULL" हमेशा "सही" वापस आएगा यदि पहला पैरामीटर शून्य है।


0

यदि डेटाबेस में बड़ी संख्या में रिकॉर्ड हैं तो null checkआप अधिक समय ले सकते हैं जैसे कि आप अलग-अलग तरीकों से नल की जांच कर सकते हैं: 1) where columnname is null 2) where not exists() 3)WHERE (case when columnname is null then true end)


0

बहुत सारे उत्तर सबसे छोटे तरीके हैं, जरूरी नहीं कि सबसे अच्छा तरीका है यदि कॉलम में बहुत सारे नल हैं। चेक को तोड़ने से ऑप्टिमाइज़र को चेक का तेजी से मूल्यांकन करने की अनुमति मिलती है क्योंकि उसे अन्य स्थिति पर काम नहीं करना पड़ता है।

(stringexpression IS NOT NULL AND trim(stringexpression) != '')

पहली तुलना झूठी होने के बाद से स्ट्रिंग तुलना का मूल्यांकन करने की आवश्यकता नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.