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

NULL मानों के साथ NOT LIKE का व्यवहार

के बारे में NULL

'anything' NOT LIKE NULL उपज NULL , नहीं TRUE .
और केवल TRUE WHERE . में फ़िल्टर एक्सप्रेशन के लिए योग्यता प्राप्त करता है खंड।

अधिकांश फ़ंक्शन NULL लौटाते हैं NULL . पर इनपुट (अपवाद हैं)। यह NULL की प्रकृति है किसी भी . में उचित आरडीबीएमएस।

अगर आप एक एकल . चाहते हैं अभिव्यक्ति, आप कर सकते थे उपयोग करें:

AND   (column_default LIKE 'nextval%')  IS NOT TRUE;

हालांकि, यह शायद ही छोटा या तेज है। मैनुअल में विवरण।

उचित क्वेरी

आपकी क्वेरी अभी भी अविश्वसनीय है। Postgres डेटाबेस में अकेले तालिका नाम अद्वितीय नहीं है, आपको इसके अतिरिक्त स्कीमा नाम निर्दिष्ट करना होगा या वर्तमान search_path पर भरोसा करना होगा इसमें पहला मैच खोजने के लिए:

संबंधित:

  • खोज_पथ पहचानकर्ता संकल्प और "वर्तमान स्कीमा" को कैसे प्रभावित करता है
SELECT column_name
FROM   information_schema.columns
WHERE  table_name = 'hstore1'
AND    table_schema = 'public'   -- your schema
AND   (column_default IS NULL OR
       column_default NOT LIKE 'nextval%');

बेहतर है, लेकिन फिर भी बुलेट प्रूफ नहीं है। 'नेक्स्टवल' से शुरू होने वाला कॉलम डिफॉल्ट एक serial नहीं बनाता है , अभी तक। देखें:

  • ऑटो इंक्रीमेंट टेबल कॉलम

यह सुनिश्चित करने के लिए, जांच करें कि उपयोग में आने वाला क्रम pg_get_serial_sequence(table_name, column_name) वाले कॉलम के पास "स्वामित्व" है या नहीं ।

मैं शायद ही कभी स्वयं सूचना स्कीमा का उपयोग करता हूँ। वे धीमे, फूले हुए दृश्य प्रमुख संस्करणों में पोर्टेबिलिटी की गारंटी देते हैं - और अन्य मानक-अनुपालन वाले RDBMS के लिए पोर्टेबिलिटी का लक्ष्य रखते हैं। लेकिन वैसे भी बहुत अधिक असंगत है। Oracle सूचना स्कीमा (2015 तक) को भी लागू नहीं करता है।

साथ ही, सूचना स्कीमा में उपयोगी पोस्टग्रेज-विशिष्ट कॉलम गायब हैं। इस मामले के लिए मैं सिस्टम कैटलॉग को इस तरह से क्वेरी कर सकता हूं:

SELECT *
FROM   pg_catalog.pg_attribute a
WHERE  attrelid = 'table1'::regclass
AND    NOT attisdropped   -- no dropped (dead) columns
AND    attnum > 0         -- no system columns
AND   NOT EXISTS (
   SELECT FROM pg_catalog.pg_attrdef d
   WHERE  (d.adrelid, d.adnum) = (a.attrelid, a.attnum)
   AND    d.adsrc LIKE 'nextval%'
   AND    pg_get_serial_sequence(a.attrelid::regclass::text, a.attname) <> ''
   );

तेज़ और अधिक विश्वसनीय, लेकिन कम पोर्टेबल।

मैनुअल:

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

कैटलॉग pg_attrdef कॉलम डिफ़ॉल्ट मान संग्रहीत करता है। स्तंभों के बारे में मुख्य जानकारी pg_attribute . में संग्रहीत है (नीचे देखें)। केवल वही कॉलम जो स्पष्ट रूप से एक डिफ़ॉल्ट मान निर्दिष्ट करते हैं (जब तालिका बनाई जाती है या कॉलम जोड़ा जाता है) में यहां एक प्रविष्टि होगी।

'table1'::regclass search_path . का उपयोग करता है नाम को हल करने के लिए, जो अस्पष्टता से बचा जाता है। आप नाम को रद्द करने के लिए स्कीमा-योग्यता प्राप्त कर सकते हैं:'myschema.table1'::regclass

संबंधित:

  • तालिका, फ़ील्ड और स्कीमा नाम का उपयोग करके संदर्भित तालिका का नाम ढूंढें
  • पोस्टग्रेज में टेबल कॉलम के डिफ़ॉल्ट मान प्राप्त करें?


  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 13 . में यूनिकोड सामान्यीकरण

  2. PostgreSQL में "त्रुटि:  प्रत्येक UNION क्वेरी में समान संख्या में कॉलम होने चाहिए" को ठीक करें

  3. PostgreSQL टेबल पर आईडी के अनुक्रम को कैसे रीसेट करें

  4. जांचें कि पोस्टग्रेज में अनुक्रम मौजूद है या नहीं (plpgsql)

  5. sqlalchemy के साथ प्रति-अनुरोध के आधार पर डेटाबेस इंजन को गतिशील रूप से कैसे बांधें