पोस्टग्रैज सिलेक्ट में कॉलम कैसे संक्षिप्त करें?


145

मेरे पास दो स्ट्रिंग कॉलम aऔर bएक तालिका है foo

select a, b from fooमान लौटाता है aऔर b। हालांकि, का संयोजन aऔर bकाम नहीं करता है। मैंने कोशिश की :

select a || b from foo

तथा

select  a||', '||b from foo

टिप्पणियों से अपडेट करें: दोनों कॉलम टाइप हैं character(2)


... या एक अन्य textप्रकार?
शाम 77:13 बजे

@acfrancis चूंकि ओपी कहता concatenateहै कि मुझे संदेह है कि वह संख्यात्मक प्रकारों के साथ काम कर रहा है, हालांकि पोस्टग्रेक्यूएल उनमें से कुछ का भी ख्याल रखेगा। यहाँ देखें: postgresql.org/docs/9.1/static/functions-string.html
PM 77-1

हां, ये कॉलम वर्ण (2) हैं। "+" काम नहीं करता है - "कोई भी ऑपरेटर दिए गए नाम और तर्क प्रकारों से मेल नहीं खाता है। आपको स्पष्ट प्रकार की जातियों को जोड़ने की आवश्यकता हो सकती है।"
एलेक्स

PostgreSQL का क्या संस्करण? यहाँ 9.1 के लिए डॉक्स हैं: postgresql.org/docs/9.1/static/functions-string.html । मेरा उदाहरण देखें: sqlfiddle.com/# -15
PM 77-1

संभवतः आपके प्रश्न में सिंटैक्स त्रुटि है जो कि संगति से संबंधित नहीं है।
पीएम 77-1

जवाबों:


260

साथ स्ट्रिंग प्रकार की तरह कॉलम character(2)(जैसा कि आप बाद में उल्लेख किया है), प्रदर्शित संयोजन सिर्फ इसलिए काम करता है, मैनुअल के हवाले से:

[...] स्ट्रिंग संघनन ऑपरेटर ( ||) गैर-स्ट्रिंग इनपुट को स्वीकार करता है, जब तक कि कम से कम एक इनपुट एक स्ट्रिंग प्रकार का न हो , जैसा कि तालिका ९conc में दिखाया गया है । अन्य मामलों के लिए, एक स्पष्ट ज़बरदस्ती डालें text[...]

बोल्ड जोर मेरा। दूसरा उदाहरण ( select a||', '||b from foo) किसी भी डेटा प्रकार के लिए काम करता है क्योंकि किसी भी मामले में पूरी अभिव्यक्ति को वैध बनाने के ', 'लिए अप्रतिबंधित स्ट्रिंग शाब्दिक चूक के बाद से text

गैर स्ट्रिंग डेटा प्रकारों के लिए, आप कर सकते हैं "ठीक" द्वारा 1 बयान कास्टिंग कम से कम एक के लिए तर्क text। ( किसी भी प्रकार को कास्ट किया जा सकता है text):

SELECT a::text || b AS ab FROM foo;

अपने स्वयं के उत्तर को देखते हुए , " काम नहीं करता है " का अर्थ " रिटर्न नाल " माना जाता था । NULL को सम्‍मिलित किसी भी चीज का परिणाम NULL है। यदि NULL मान शामिल हो सकते हैं और परिणाम NULL नहीं होगा, तो concat_ws()किसी भी संख्या के मानों को संक्षिप्त करने के लिए उपयोग करें (पोस्ट 9.1 या बाद के संस्करण):

SELECT concat_ws(', ', a, b) AS ab FROM foo;

या concat()यदि आपको विभाजकों की आवश्यकता नहीं है:

SELECT concat(a, b) AS ab FROM foo;

टाइप फ़ंक्शंस के लिए कोई ज़रूरत नहीं है क्योंकि दोनों फ़ंक्शन "any"इनपुट लेते हैं और टेक्स्ट अभ्यावेदन के साथ काम करते हैं।

COALESCEइस संबंधित उत्तर में अधिक विवरण (और एक खराब विकल्प क्यों है):

टिप्पणी में अद्यतन के बारे में

+Postgres (या मानक SQL) में स्ट्रिंग समाकलन के लिए एक वैध ऑपरेटर नहीं है। इसे अपने उत्पादों में शामिल करना Microsoft का निजी विचार है।

उपयोग करने के लिए शायद ही कोई अच्छा कारण है character(n)(समानार्थक शब्द char(n))। का प्रयोग करें textयाvarchar । विवरण:


धन्यवाद। 1 संस्करण शून्य के साथ काम नहीं करता है और 2 ने मुझे कॉन्कटैट_र्स के लिए त्रुटि दी: कोई फ़ंक्शन दिए गए नाम और तर्क प्रकारों से मेल नहीं खाता है। आपको स्पष्ट प्रकार की जातियों को जोड़ने की आवश्यकता हो सकती है।
एलेक्स

1
तुमने देखा Postgres 9.1 or later, है ना? आपको प्रश्न में , के साथ शुरू करने के लिए Postgres का अपना संस्करण प्रदान करना चाहिए था । कृपया किसी भी अन्य चीज़ के लिए वापस आने से पहले, सभी मांगी गई जानकारी के साथ अपने प्रश्न को अपडेट करें
एरविन ब्रान्डेसटेटर

धन्यवाद, मुझे जो समाधान मिला वह किसी भी पोस्टग्रेज संस्करण के लिए काम करता है
एलेक्स

SELECT concat(a, b) FROM foo;Postgres 9.3 जब में मेरे लिए काम करता है aऔर bकर रहे हैं VARCHARरों।
elimisteve

आपके उत्तर के लिए धन्यवाद, इसने मेरी समस्या हल कर दी :)।
अश्वकार

34

मूल्यों में अशक्तता में समस्या थी; तब समस्वरता नल के साथ काम नहीं करती है। समाधान इस प्रकार है:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;

18

यह बेहतर है कि कॉनकैट फ़ंक्शन को पोस्टग्रेक्यूएल में कॉन्सेटेशन के लिए उपयोग करें

जैसे: select CONCAT(first_name,last_name) from person where pid = 136

अगर आप column_a का उपयोग कर रहे हैं || '' || 2 कॉलम के लिए कॉलम_ बी, अगर कॉलम_ए या कॉलम_ बी में से कोई भी मूल्य शून्य है, तो शून्य मान वापस आ जाएगा। जो सभी मामलों में पसंद नहीं किया जा सकता है .. इसलिए इसके बजाय

||

उपयोग

concat

यदि उनमें से किसी का भी मूल्य है तो यह प्रासंगिक मूल्य लौटाएगा


7

CONCAT फ़ंक्शन कभी-कभी पुराने पोस्टग्रेसीक्यूएल संस्करण के साथ काम नहीं करते हैं

देखें कि मैंने CONCAT का उपयोग किए बिना समस्या का समाधान क्या किया

 u.first_name || ' ' || u.last_name as user,

या भी आप उपयोग कर सकते हैं

 "first_name" || ' ' || "last_name" as user,

दूसरे मामले में मैंने first_name और last_name के लिए दोहरे उद्धरण चिह्नों का उपयोग किया

आशा है कि यह उपयोगी होगा, धन्यवाद


1
अगर मेरा पहला नाम या अंतिम नाम अशक्त है, तो संक्षिप्त मूल्य भी अशक्त दिखा रहा है
लोकेश

2

जैसा कि मैं भी इसमें फंस गया था, मुझे लगता है कि मुझे उस समाधान को साझा करना चाहिए जो मेरे लिए सबसे अच्छा काम करता है। मुझे भी लगता है कि यह बहुत सरल है।

यदि आप Capitalized टेबल नाम का उपयोग करते हैं।

SELECT CONCAT("firstName", ' ', "lastName") FROM "User"

यदि आप लोअरकेस टेबल नाम का उपयोग करते हैं

SELECT CONCAT(firstName, ' ', lastName) FROM user

बस!। जैसा कि PGSQL कॉलम घोषणा के लिए डबल कोट और स्ट्रिंग के लिए सिंगल कोट की गणना करता है, यह एक आकर्षण की तरह काम करता है।


1

PHP का Laravel फ्रेमवर्क, मैं खोज का उपयोग कर रहा हूं first_name, last_name फ़ील्ड पूर्ण नाम खोज की तरह विचार करती हैं

का उपयोग कर || प्रतीक या concat_ws (), concat () विधियाँ

$names = str_replace(" ", "", $searchKey);                               
$customers = Customer::where('organization_id',$this->user->organization_id)
             ->where(function ($q) use ($searchKey, $names) {
                 $q->orWhere('phone_number', 'ilike', "%{$searchKey}%"); 
                 $q->orWhere('email', 'ilike', "%{$searchKey}%");
                 $q->orWhereRaw('(first_name || last_name) LIKE ? ', '%' . $names. '%');
    })->orderBy('created_at','desc')->paginate(20);

यह काम किया आकर्षण !!!



-1

उदाहरण के लिए यदि कर्मचारी तालिका है जिसमें कॉलम निम्नलिखित हैं:

employee_number,f_name,l_name,email_id,phone_number 

अगर हम f_name + l_nameजैसा चाहते हैं name

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;

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