आम तौर पर, मैं @kgrittn की सलाह से सहमत हूं। इसके लिए जाओ।
लेकिन concat()
. के बारे में अपने मूल प्रश्न का समाधान करने के लिए :नया फ़ंक्शन concat()
उपयोगी है यदि आपको शून्य मानों से निपटने की आवश्यकता है - और अशक्त को न तो आपके प्रश्न में और न ही आपके द्वारा संदर्भित प्रश्न में खारिज किया गया है।
यदि आप अशक्त मानों, अच्छे पुराने (एसक्यूएल मानक) संयोजन ऑपरेटर को रद्द कर सकते हैं ||
अभी भी सबसे अच्छा विकल्प है, और @luis का जवाब ठीक है:
SELECT col_a || col_b;
यदि आपका कोई भी कॉलम शून्य हो सकता है, उस स्थिति में परिणाम शून्य होगा। आप COALESCE
. से बचाव कर सकते हैं :
SELECT COALESCE(col_a, '') || COALESCE(col_b, '');
लेकिन यह अधिक तर्कों के साथ जल्दी से थकाऊ हो जाता है। वहीं concat()
में आता है, जो कभी नहीं शून्य लौटाता है, भले ही सभी . न हो तर्क शून्य हैं। प्रति दस्तावेज़:
NULL तर्कों पर ध्यान नहीं दिया जाता है।
SELECT concat(col_a, col_b);
शेष कोने का मामला दोनों विकल्पों के लिए सभी इनपुट कॉलम रिक्त हैं किस स्थिति में हमें अभी भी एक खाली स्ट्रिंग मिलती है ''
, लेकिन कोई इसके बजाय शून्य चाहता है (कम से कम मैं चाहता हूं)। एक संभावित तरीका:
SELECT CASE
WHEN col_a IS NULL THEN col_b
WHEN col_b IS NULL THEN col_a
ELSE col_a || col_b
END;
यह अधिक कॉलम के साथ और अधिक जटिल हो जाता है। दोबारा, concat()
use का उपयोग करें लेकिन विशेष शर्त के लिए एक चेक जोड़ें:
SELECT CASE WHEN (col_a, col_b) IS NULL THEN NULL
ELSE concat(col_a, col_b) END;
यह कैसे काम करता है? (col_a, col_b)
एक पंक्ति प्रकार अभिव्यक्ति के लिए आशुलिपि संकेतन है ROW (col_a, col_b)
. और एक पंक्ति प्रकार केवल शून्य है यदि सभी कॉलम शून्य हैं। विस्तृत विवरण:
- स्तंभों के एक सेट पर पूर्ण बाधा नहीं
साथ ही, concat_ws()
का उपयोग करें तत्वों के बीच विभाजक जोड़ने के लिए (ws
"विभाजक के साथ") के लिए।
केविन के उत्तर की तरह एक अभिव्यक्ति:
SELECT $1.zipcode || ' - ' || $1.city || ', ' || $1.state;
PostgreSQL 8.3 में शून्य मानों के लिए तैयार करने के लिए कठिन है (बिना concat()
) एक ही रास्ता (कई में से):
SELECT COALESCE(
CASE
WHEN $1.zipcode IS NULL THEN $1.city
WHEN $1.city IS NULL THEN $1.zipcode
ELSE $1.zipcode || ' - ' || $1.city
END, '')
|| COALESCE(', ' || $1.state, '');
फ़ंक्शन अस्थिरता केवल STABLE
है
concat()
और concat_ws()
STABLE
हैं फ़ंक्शन, IMMUTABLE
. नहीं क्योंकि वे डेटाटाइप आउटपुट फ़ंक्शंस (जैसे timestamptz_out
. को लागू कर सकते हैं ) जो स्थानीय सेटिंग्स पर निर्भर करता है।
टॉम लेन द्वारा स्पष्टीकरण।
यह सूचकांक अभिव्यक्तियों में उनके प्रत्यक्ष उपयोग को प्रतिबंधित करता है। अगर आप जानते हैं कि परिणाम वास्तव में आपके मामले में अपरिवर्तनीय है, आप इसके आसपास IMMUTABLE
के साथ काम कर सकते हैं समारोह आवरण। यहां उदाहरण:
- क्या PostgreSQL "उच्चारण असंवेदनशील" संयोजनों का समर्थन करता है?