একটি পোস্টগ্রিস নির্বাচন করে কলামগুলি কীভাবে সংযুক্ত করবেন?


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-1

@acfrancis যেহেতু ওপি বলেছেন concatenateযে আমি সন্দেহ করি যে তিনি সংখ্যাসূচক প্রকারের সাথে কাজ করছেন, যদিও পোস্টগ্র্যাস এসকিউএল তাদের মধ্যে কিছু যত্ন নেবে। এখানে দেখুন: postgresql.org/docs/9.1/static/function-string.html
প্রধানমন্ত্রী 77-1

হ্যাঁ, এই কলামগুলি চরিত্র (2)। "+" কাজ করে না - "কোনও অপারেটর প্রদত্ত নাম এবং যুক্তি ধরণের (গুলি) এর সাথে মেলে না You আপনার স্পষ্টত ধরণের ক্যাসেট যুক্ত করার প্রয়োজন হতে পারে।"
অ্যালেক্স

PostgreSQL এর কোন সংস্করণ? এখানে 9.1 এর জন্য ডকস রয়েছে: postgresql.org/docs/9.1/static/funitions-string.html । আমার উদাহরণ দেখুন: sqlfiddle.com/#!15/d41d8/182
প্রধানমন্ত্রী 77-1

আপনার ক্যোয়ারিতে সম্ভবত একটি বাক্য গঠন ত্রুটি রয়েছে যা মনগড়া সম্পর্কিত নয়।
প্রধানমন্ত্রী 77-1

উত্তর:


260

সঙ্গে স্ট্রিং টাইপ মত কলাম character(2)(যেমন আপনি পরে উল্লিখিত), প্রদর্শিত সংযুক্তকরণের মাত্র কারণ কাজ করে, ম্যানুয়াল উদ্ধৃত:

[...] স্ট্রিং কনটেনটেশন অপারেটর ( ||) নন-স্ট্রিং ইনপুট গ্রহণ করে, যতক্ষণ না সারণী 9.8 তে দেখানো হয়েছে সে হিসাবে কমপক্ষে একটি ইনপুট স্ট্রিং প্রকারের হয় । অন্যান্য ক্ষেত্রে, একটি সুস্পষ্ট জোর inোকান [...]text

বোল্ড জোর আমার। ২ য় উদাহরণ ( select a||', '||b from foo) টাইপ না করে টাইপ করা স্ট্রিং আক্ষরিক ডিফল্ট যে কোনও ক্ষেত্রে পুরো এক্সপ্রেশনটিকে বৈধ করে তুলতে কোনও ডেটা ধরণের জন্য কাজ করে ।', 'text

নন-স্ট্রিং ডেটা প্রকারের জন্য, আপনি কমপক্ষে একটি যুক্তি কাস্ট করে the ম বিবৃতিটি "ঠিক" করতে পারেন text। (যে কোনও প্রকারে কাস্ট করা যেতে পারে text):

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

আপনার নিজের উত্তর থেকে বিচার করা , " কাজ করে না " এর অর্থ " NULL প্রদান করে " বলে মনে করা হয়েছিল । NUL- তে জড়িত কোনও কিছুর ফলাফল হ'ল নুল। যদি 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একটি দরিদ্র বিকল্প):

মন্তব্যে আপডেট সম্পর্কে

+পোস্টগ্রিসে (বা স্ট্যান্ডার্ড এসকিউএল) স্ট্রিং কনটেনটেশনের জন্য কোনও বৈধ অপারেটর নয়। এটি তাদের পণ্যগুলিতে যুক্ত করা মাইক্রোসফ্টের একটি ব্যক্তিগত ধারণা।

ব্যবহারের জন্য খুব ভাল কোনও কারণই নেই character(n)(প্রতিশব্দ char(n):)। ব্যবহার করুন textবাvarchar । বিবরণ:


ধন্যবাদ. 1 ম সংস্করণ নাল সাথে কাজ করে না এবং দ্বিতীয়টি আমাকে কনক্যাট_উজের জন্য ত্রুটি দিয়েছে: প্রদত্ত নাম এবং যুক্তির ধরণের সাথে কোনও ফাংশন মেলে না। আপনার স্পষ্টত ধরণের ক্যাসেট যুক্ত করার প্রয়োজন হতে পারে।
অ্যালেক্স

1
তুমি দেখেছ Postgres 9.1 or later, তাই না? প্রশ্নটিতে আপনার পোস্টগ্রিসের সংস্করণটি সরবরাহ করা উচিত ছিল । আপনি অন্য কোনও কিছুর জন্য ফিরে আসার আগে দয়া করে আপনার অনুরোধকৃত সমস্ত তথ্য দিয়ে আপনার প্রশ্নটি আপডেট করুন
এরউইন ব্র্যান্ডসটেটার

আপনাকে ধন্যবাদ, আমি যে সমাধানটি পেয়েছি তা কোনও পোস্টগ্রাস সংস্করণের জন্য কাজ করে
অ্যালেক্স

SELECT concat(a, b) FROM foo;Postgres 9.3 এ যখন আমার জন্য কাজ করে তখন abহয় VARCHAR
elimisteve

আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, এটি আমার সমস্যার সমাধান করেছে :)।
আশওয়াকর

33

সমস্যাটি মানগুলিতে শূন্য ছিল; তারপরে কনকনেটেশন নাল দিয়ে কাজ করে না। সমাধানটি নিম্নরূপ:

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

18

কনগ্র্যাটেশনের জন্য পোস্টগ্রেএসকিউএলে কনক্যাট ফাংশন ব্যবহার করা ভাল

যেমন: select CONCAT(first_name,last_name) from person where pid = 136

আপনি যদি কলাম_এ ব্যবহার করছেন || '' || কলাম_বি ২ কলামের সংমিশ্রণের জন্য, কলাম_এ বা কলাম_ বি এর মানগুলির মধ্যে যদি কোনও নাল কোয়েরি হয় তবে নাল মানটি আসবে। যা সব ক্ষেত্রেই পছন্দ নাও হতে পারে .. সুতরাং এর পরিবর্তে

||

ব্যবহার

CONCAT

এটিগুলির কোনওটির যদি মান থাকে তবে এটি প্রাসঙ্গিক মান প্রদান করবে


7

কনক্যাট ফাংশন কখনও কখনও পুরানো postgreSQL সংস্করণ সঙ্গে কাজ করে না

কনক্যাট না ব্যবহার করে সমস্যার সমাধান করতে আমি কী ব্যবহার করেছি তা দেখুন

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

অথবা আপনি ব্যবহার করতে পারেন

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

দ্বিতীয় ক্ষেত্রে আমি প্রথম নাম এবং শেষ নামটির জন্য ডাবল উদ্ধৃতি ব্যবহার করেছি

আশা করি এটি কার্যকর হবে, ধন্যবাদ


1
আমার প্রথম নাম বা শেষ নামটি যদি নাল হয় তবে কনক্যাট মানটিও নাল প্রদর্শন করে
লোকেশ

2

যেহেতু আমিও এতে আটকে ছিলাম, ভাবেন যে আমার পক্ষে সবচেয়ে ভাল সমাধান করা সমাধানটি আমার ভাগ করে নেওয়া উচিত। আমিও মনে করি এটি অনেক সহজ।

আপনি যদি বড় বড় টেবিলের নাম ব্যবহার করেন।

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

আপনি যদি ছোট হাতের টেবিলের নাম ব্যবহার করেন

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

এটাই!. পিজিএসকিউএল যেমন কলাম ঘোষণার জন্য ডাবল উদ্ধৃতি এবং স্ট্রিংয়ের জন্য একক উদ্ধৃতি গণনা করেছে, এটি একটি কবজির মতো কাজ করে।


1

পিএইচপি-র লারাভেল ফ্রেমওয়ার্ক, আমি অনুসন্ধানের প্রথম নামটি ব্যবহার করছি, শেষ নামটি ক্ষেত্রগুলি পুরো নাম অনুসন্ধানের মতো বিবেচনা করে

ব্যবহার || প্রতীক বা কনক্যাট_উজ (), কনক্যাট () পদ্ধতি

$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;

এই উত্তরটি বিদ্যমান উত্তরের সাথে কী যুক্ত করে?
এরউইন ব্র্যান্ডস্টেটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.