PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

रिकॉर्ड के लिए IS NOT NULL टेस्ट वैरिएबल सेट होने पर TRUE नहीं लौटाता है

मुझे दो संभावित कारण दिखाई दे रहे हैं, क्यों...

<ब्लॉकक्वॉट>

इनमें से कोई भी वृद्धि मेरे संदेश लॉग में दिखाई नहीं देती है

लॉग नहीं किया गया

सबसे पहले, एक NOTICE सामान्य रूप से डिफ़ॉल्ट सेटिंग्स के साथ डेटाबेस लॉग में नहीं लिखा जाता है। मैं यहां मैनुअल को उद्धृत करता हूं:

<ब्लॉकक्वॉट>

log_min_messages (enum )

यह नियंत्रित करता है कि सर्वर लॉग में कौन से संदेश स्तर लिखे गए हैं। मान्य मान हैं DEBUG5 , DEBUG4 , DEBUG3 , DEBUG2 , DEBUG1 , INFO , NOTICE , WARNING , ERROR , LOG , FATAL , और PANIC . (...)
डिफ़ॉल्ट चेतावनी . है . ध्यान दें कि LOG client_min_messages . की तुलना में यहां एक अलग रैंक है ।

बोल्ड जोर मेरा। अलग-अलग डिफ़ॉल्ट पर भी ध्यान दें (NOTICE ) client_min_messages . के लिए (मैनुअल में पिछला आइटम)।

अमान्य परीक्षण

दूसरे, विचार करें कि एक पंक्ति अभिव्यक्ति का मूल्यांकन कैसे किया जाता है। एक परीक्षण row_variable IS NULL रिटर्न TRUE अगर (और केवल अगर) हर एक तत्व है NULL . निम्नलिखित उदाहरण को देखते हुए:

SELECT (1, NULL) IS NULL AS a     -- FALSE
      ,(1, NULL) IS NOT NULL AS b -- also FALSE

दोनों भाव वापसी FALSE . दूसरे शब्दों में, एक पंक्ति (या रिकॉर्ड) चर (1, NULL) न तो NULL है , न ही यह NOT NULL . है . इसलिए, आपके दोनों परीक्षण विफल हो जाते हैं।

-> SQLfiddle अधिक विवरण के साथ।

CHECK . में इस व्यवहार के लिए अधिक विवरण, स्पष्टीकरण, लिंक और संभावित अनुप्रयोग इस संबंधित उत्तर में बाधा:
स्तंभों के एक सेट पर पूर्ण बाधा नहीं

आप NULL के साथ एक रिकॉर्ड वैरिएबल भी असाइन कर सकते हैं (rec := NULL ), जिसके परिणामस्वरूप प्रत्येक तत्व NULL होता है - यदि प्रकार एक प्रसिद्ध पंक्ति प्रकार है। अन्यथा, हम एक अनाम रिकॉर्ड के साथ काम कर रहे हैं और संरचना अपरिभाषित है और आप शुरू में तत्वों तक नहीं पहुंच सकते हैं। लेकिन rowtype . के साथ ऐसा नहीं है जैसे आपके उदाहरण में (जो हमेशा प्रसिद्ध है)।

समाधान:FOUND

<ब्लॉकक्वॉट>

यदि आपको SELECT * INTO . से कोई पंक्ति प्राप्त हुई है, तो परीक्षण करने का सही तरीका क्या है? ?

आपको यह विचार करना होगा कि पंक्ति NULL हो सकती है, भले ही उसे असाइन किया गया हो। क्वेरी बहुत अच्छी तरह से NULL मानों का एक गुच्छा लौटा सकती है (यदि आपकी क्वेरी में तालिका परिभाषा NULL मानों की अनुमति देती है)। ऐसा परीक्षण डिज़ाइन द्वारा अविश्वसनीय होगा।

एक सरल और सुरक्षित तरीका है। उपयोग GET DIAGNOSTICS ... या (जहां लागू हो) विशेष चर FOUND :

SELECT * FROM my_table WHERE owner_id = 6 INTO my_var;

IF NOT FOUND THEN
   RAISE NOTICE 'Query did not return a row!';
END IF;

मैनुअल में विवरण।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आवश्यक PostgreSQL निगरानी - भाग 3

  2. कैसे Width_Bucket () PostgreSQL में काम करता है

  3. PostgreSQL क्रिएट एक्सटेंशन का उपयोग करके नए मॉड्यूल बनाना

  4. कैसे make_date () PostgreSQL में काम करता है

  5. अनुरोधित सेवा बनाने में असमर्थ [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]