วิธีการต่อคอลัมน์ใน Postgres SELECT ได้อย่างไร


145

ฉันมีสองคอลัมน์สตริงaและในตารางbfoo

select a, b from fooค่าผลตอบแทนและa bอย่างไรก็ตามการต่อข้อมูลaและbไม่ทำงาน ฉันเหนื่อย :

select a || b from foo

และ

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

อัปเดตจากความคิดเห็น: character(2)คอลัมน์เป็นประเภท


... หรือtextประเภทอื่น
PM 77-1

@acfrancis เนื่องจาก OP บอกว่าconcatenateฉันสงสัยว่าเขาจัดการกับตัวเลขเป็นจำนวนมากถึงแม้ว่า PostgreSQL จะดูแลบางอย่างเช่นกัน ดูที่นี่: postgresql.org/docs/9.1/static/functions-string.html
PM 77-1

ใช่คอลัมน์เหล่านี้เป็นอักขระ (2) "+" ใช้งานไม่ได้ - "ไม่มีโอเปอเรเตอร์ที่ตรงกับชื่อและประเภทของอาร์กิวเมนต์ที่ระบุคุณอาจต้องเพิ่ม casts ประเภทชัดเจน"
อเล็กซ์

PostgreSQL รุ่นใด นี่คือเอกสารสำหรับ 9.1: postgresql.org/docs/9.1/static/functions-string.html ดูตัวอย่างของฉัน: sqlfiddle.com/#!15/d41d8/182
PM 77-1

คุณอาจมีข้อผิดพลาดทางไวยากรณ์ในข้อความค้นหาของคุณซึ่งไม่เกี่ยวข้องกับการต่อข้อมูล
PM 77-1

คำตอบ:


260

ด้วยคอลัมน์ประเภทสตริงเช่นcharacter(2)(ดังที่คุณกล่าวถึงในภายหลัง) การต่อข้อมูลที่แสดงนั้นใช้งานได้เพราะอ้างถึงคู่มือ:

[ ... ] ผู้ประกอบการ concatenation สตริง ( ||) รับข้อมูลที่ไม่ใช่สตริงตราบใดที่อย่างน้อยหนึ่งการป้อนข้อมูลเป็นประเภทสตริงดังแสดงใน ตารางที่ 9.8 สำหรับกรณีอื่น ๆ แทรกการข่มขู่ที่ชัดเจนไปที่text[... ]

เหมืองเน้นหนัก ตัวอย่างที่ 2 ( select a||', '||b from foo) ใช้งานได้กับชนิดข้อมูลใด ๆเนื่องจาก', 'ค่าเริ่มต้นตัวอักษรสตริงที่ไม่ได้พิมพ์เพื่อพิมพ์textทำให้นิพจน์ทั้งหมดถูกต้องในทุกกรณี

สำหรับชนิดข้อมูลที่ไม่ใช่สตริงคุณสามารถ "แก้ไข" คำสั่งที่ 1 โดยการหล่อtextอย่างน้อยหนึ่งอาร์กิวเมนต์ ( ประเภทใดก็ได้ที่สามารถส่งไปยังtext):

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

ตัดสินจากคำตอบของคุณเองว่า " ไม่ทำงาน " ควรจะหมายถึง " return NULL " ผลลัพธ์ของสิ่งที่ต่อกันเป็น NULL คือ NULL หากค่า NULLสามารถมีส่วนร่วมและผลลัพธ์จะต้องไม่เป็น NULL ใช้concat_ws()เพื่อเชื่อมค่าจำนวนเท่าใดก็ได้ (Postgres 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 ไม่ทำงานกับ null และรุ่นที่ 2 ให้ข้อผิดพลาดสำหรับฉัน concat_ws: ไม่มีฟังก์ชันที่ตรงกับชื่อและประเภทอาร์กิวเมนต์ที่กำหนด คุณอาจต้องเพิ่มประเภทการส่งแบบชัดแจ้ง
อเล็กซ์

1
คุณเห็นPostgres 9.1 or laterใช่มั้ย คุณควรจะได้ให้รุ่นของ Postgres จะเริ่มต้นด้วยในคำถาม โปรดอัปเดตคำถามของคุณพร้อมข้อมูลที่ร้องขอทั้งหมดก่อนที่คุณจะกลับมาทำสิ่งอื่นใด
Erwin Brandstetter

ขอบคุณวิธีแก้ปัญหาที่ฉันพบว่าใช้ได้กับรุ่น Postgres
Alex

SELECT concat(a, b) FROM foo;งานสำหรับฉันใน Postgres 9.3 เมื่อaและbเป็นVARCHARs
elimisteve

ขอบคุณสำหรับคำตอบการแก้ปัญหาของฉัน :)
ashwaqar

34

ปัญหาอยู่ในค่านัลในค่า; การต่อข้อมูลจะไม่ทำงานกับค่า Null วิธีแก้ปัญหามีดังนี้:

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

18

มันจะดีกว่าที่จะใช้ฟังก์ชัน CONCAT ใน PostgreSQL สำหรับการต่อข้อมูล

เช่น : select CONCAT(first_name,last_name) from person where pid = 136

หากคุณกำลังใช้ column_a || '' || column_b สำหรับการต่อข้อมูลสำหรับ 2 คอลัมน์หากค่าใด ๆ ใน column_a หรือ column_b คือเคียวรี null จะส่งคืนค่า null ซึ่งอาจไม่เป็นที่ต้องการในทุกกรณี .. ดังนั้นแทนที่จะเป็นแบบนี้

||

ใช้

CONCAT

มันจะคืนค่าที่เกี่ยวข้องหากทั้งสองมีมูลค่า


7

ฟังก์ชั่น CONCAT บางครั้งไม่สามารถทำงานกับรุ่น postgreSQL ที่เก่ากว่าได้

ดูสิ่งที่ฉันใช้ในการแก้ปัญหาโดยไม่ต้องใช้ CONCAT

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

หรือคุณสามารถใช้

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

ในกรณีที่สองฉันใช้เครื่องหมายคำพูดคู่สำหรับชื่อและนามสกุล

หวังว่านี่จะเป็นประโยชน์ขอบคุณ


1
ถ้าชื่อหรือนามสกุลของฉันเป็นโมฆะค่า concat ก็จะแสดงค่าว่างเช่นกัน
Lokesh

2

ในขณะที่ฉันยังติดอยู่ในนี้คิดว่าฉันควรแบ่งปันทางออกที่ดีที่สุดสำหรับฉัน ฉันคิดว่ามันง่ายกว่ามาก

ถ้าคุณใช้ชื่อตารางตัวพิมพ์ใหญ่

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

ถ้าคุณใช้ชื่อตารางตัวพิมพ์เล็ก

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

แค่นั้นแหละ!. เนื่องจาก PGSQL นับการเสนอราคาสองครั้งสำหรับการประกาศคอลัมน์และการเสนอราคาแบบครั้งเดียวสำหรับสตริงสิ่งนี้จึงทำงานได้อย่างมีเสน่ห์


1

เฟรมเวิร์ก Laravel ของ PHP ฉันใช้ search 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_namename

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

คำตอบนี้เพิ่มอะไรมากกว่าคำตอบที่มีอยู่
Erwin Brandstetter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.