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

PostgreSQL में सरणी सभी NULLs है

1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL

1 और 2 कोई भी हो सकता है दो अलग-अलग संख्याएं।

विकल्प और प्रदर्शन

बहुत तरीके हैं। मैंने एक त्वरित परीक्षण केस इकट्ठा किया:

SELECT arr::text
     , -1 = ALL(arr) IS NULL                              AS xsimple
     , 1 = ALL(arr) IS NULL AND 2 = ALL(arr) IS NULL      AS simple
     , array_remove(arr, NULL) = '{}'                     AS array_rem
     , cardinality(array_positions(arr, NULL))
     = cardinality(arr)                                   AS array_pos
     , TRUE = ALL (SELECT unnest(arr) IS NULL)            AS michael
     , (SELECT bool_and(e IS NULL) FROM unnest(arr) e)    AS bool_and
     , NOT EXISTS (SELECT unnest(arr) EXCEPT SELECT null) AS exist
FROM  (
   VALUES
     ('{1,2,NULL,3}'::int[])
   , ('{1,1,1}')
   , ('{2,2,2}')
   , ('{NULL,NULL,NULL}')
   , ('{}'::int[])
   ) t(arr);

       arr        | xsimple | simple | array_rem | array_pos | michael | bool_and | exist 
------------------+---------+--------+-----------+-----------+---------+----------+-------
 {1,2,NULL,3}     | f       | f      | f         | f         | f       | f        | f
 {1,1,1}          | f       | f      | f         | f         | f       | f        | f
 {2,2,2}          | f       | f      | f         | f         | f       | f        | f
 {NULL,NULL,NULL} | t       | t      | t         | t         | t       | t        | t
 {}               | f       | f      | t         | t         | t       |          | t

array_remove() पोस्टग्रेज 9.3 या बाद के संस्करण की आवश्यकता है।
array_positions() पोस्टग्रेज 9.5 या बाद के संस्करण की आवश्यकता है।

chk_michael वर्तमान में @michael द्वारा स्वीकृत उत्तर से है .
कॉलम व्यंजक के प्रदर्शन के क्रम में हैं। सबसे तेज़ पहले।
मेरे साधारण चेक प्रदर्शन पर हावी हैं, array_remove() के साथ अगला। बाकी नहीं रख सकते।

विशेष मामला खाली सरणी ({} ) ध्यान देने की आवश्यकता है। अपेक्षित परिणाम को परिभाषित करें और या तो एक उपयुक्त अभिव्यक्ति चुनें या एक अतिरिक्त जांच जोड़ें।

db<>fiddle यहां - प्रदर्शन परीक्षण . के साथ
पुराना sqlfiddle

यह कैसे काम करता है?

व्यंजक 1 = ALL(arr) पैदावार:

TRUE .. यदि सभी तत्व 1 . हैं
FALSE .. यदि कोई तत्व <> 1 . है (कोई भी तत्व जो IS NOT NULL )
NULL .. यदि कम से कम एक तत्व IS NULL और कोई भी तत्व <> 1 नहीं है

इसलिए, यदि हम किसी एक तत्व को जानते हैं जो नहीं दिखाएँ (CHECK . द्वारा लागू किया गया) बाधा), जैसे -1 , हम इसे सरल बना सकते हैं:

-1 = ALL(arr) IS NULL

अगर कोई संख्या दिखाई दे सकती है, दो अलग-अलग संख्याओं की जांच करें। परिणाम केवल NULL हो सकता है दोनों के लिए यदि सरणी में NULL के अलावा कुछ नहीं है . वोइला।



  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 तालिका में UUID, CHAR और VARCHAR के बीच प्रदर्शन अंतर?

  2. पोस्टग्रेज में एनम टाइप वैल्यू कैसे डिलीट करें?

  3. पोस्टग्रेज सर्वर से कनेक्ट नहीं हो सका

  4. क्या मैं निश्चित आकार के घूर्णन आयत के अंदर बिंदुओं को खोजने के लिए पोस्टग्रेस फ़ंक्शन का उपयोग कर सकता हूं?

  5. PostgreSQL में एक पूर्णांक को Enum में परिवर्तित करना