ตัวดำเนินการเรียงต่อสตริงใน Oracle คืออะไร


172

ตัวดำเนินการเรียงต่อสตริงใน Oracle SQL คืออะไร

มีคุณสมบัติ "น่าสนใจ" ที่ฉันควรระวังหรือไม่

(ดูเหมือนจะชัดเจน แต่ฉันไม่พบคำถามก่อนหน้านี้ถาม)


คำตอบ:


237

มันเป็น||เช่น:

select 'Mr ' || ename from emp;

ฟีเจอร์ "น่าสนใจ" อย่างเดียวที่ฉันนึกได้ก็คือมันจะให้'x' || nullผลตอบแทน'x'ไม่ใช่nullอย่างที่คุณคาดหวัง


3
ฉันคาดหวังว่าเป็นโมฆะจากการดำเนินการเชิงตรรกะ ... ไม่แน่ใจว่าฉันเคยคิดเกี่ยวกับการดำเนินการสตริง

1
แน่นอนว่า Oracle ถือว่าเป็นโมฆะและ '' เหมือนกันและ 'x' || '' = 'x' เข้าท่า แต่ถ้าคุณคิดว่า null เป็น "undefined" หรือ "unknown" ดังนั้น 'x' || null อาจเป็นสตริงใด ๆ ที่ขึ้นต้นด้วย 'x' ดังนั้นตัวมันเอง "unknown"
Tony Andrews

4
||ใน Oracle ไม่ได้เป็นผู้ประกอบการตรรกะดังนั้นผลตอบแทน'x'||null x
I Junja

3
@ipip: ฉันสับสน - ถ้าโดย "ผู้ประกอบตรรกะ" คุณหมายถึงผู้ประกอบการต้องการAND, NOTฯลฯ แล้วแน่นอน||ไม่ได้เป็นผู้ประกอบการเชิงตรรกะ แต่สิ่งที่ต้องทำเมื่อ'x'||nullกลับมาx? n+nullส่งคืน null ดังนั้น+ตัวดำเนินการเชิงตรรกะคืออะไร
Tony Andrews

2
การจัดการค่า Null ของ Oracle ในการต่อข้อมูลไม่เป็นมาตรฐานซึ่งแตกต่างจากสเปค SQL92 (และ Postgres) - ดูpostgresql.org/message-id/921.1144705646@sss.pgh.pa.us
beldaz

61

นอกจากนี้ยังมีการต่อกัน แต่ก็ไม่ได้ใช้มากนัก

select concat('a','b') from dual;

6
นี่เป็นวิธีที่ดีกว่า || สัญลักษณ์. ใช้ || เพียงแค่สับสนตามการใช้ | | ของภาษาอื่น
จอร์แดน

17
ตกลงเพื่อความชัดเจน แต่ || มีข้อได้เปรียบในการอนุญาตให้มากกว่า 2 ฟิลด์ได้อย่างง่ายดาย
Patrick Honorez

3
CONCATยังเข้ากันได้กับ DBMS อื่น ๆ (อย่างน้อย MySQL และ Postgres)
lapo

1
แปลกที่มันไม่ได้เกิดขึ้นกับคณะกรรมการ ANSI SQL ที่ทุกคนอาจต้องเชื่อมต่อกันมากกว่าสองสิ่ง (กันไปสำหรับอัจฉริยะที่ Oracle ที่มากับnvl().)
วิลเลียมโรเบิร์ต

1
CONCATนอกจากนี้ยังอยู่ใน Microsoft SQL Server 2012 เป็นต้นไป CONCAT แม้ว่าจะไม่ได้มาตรฐานเป็นวิธีที่แน่นอนหากคุณต้องการให้โค้ดของคุณพกพาได้ ( ||เป็นตัวดำเนินการมาตรฐาน ANSI จริงแม้ว่าคุณจะไม่ทราบด้วยการมองหาการสนับสนุน!)
Matt Gibson

11

ฉันจะแนะนำ concat เมื่อจัดการกับ 2 สายและ || เมื่อสตริงเหล่านั้นมากกว่า 2:

select concat(a,b)
  from dual

หรือ

  select 'a'||'b'||'c'||'d'
        from dual

2
ขอโทษฉันทราบดีว่านี่คือ 2 ปีที่แล้ว แต่ทำไมคุณต้องการconcat(a,b)มากกว่าa||b?
Tony Andrews

|| สั้นกว่ายืดหยุ่นและเรียบง่าย ดูคำสั่งที่เขาเลือก
JoshYates1980

6
DECLARE
     a      VARCHAR2(30);
     b      VARCHAR2(30);
     c      VARCHAR2(30);
 BEGIN
      a  := ' Abc '; 
      b  := ' def ';
      c  := a || b;
 DBMS_OUTPUT.PUT_LINE(c);  
   END;

ผลลัพธ์ :: Abc def


1

การใช้CONCAT(CONCAT(,),)งานได้สำหรับฉันเมื่อเชื่อมโยงมากกว่าสองสาย

ปัญหาของฉันต้องทำงานกับสตริงวันที่ (เท่านั้น) และสร้างYYYYMMDDจากYYYY-MM-DDดังต่อไปนี้ (เช่นโดยไม่ต้องแปลงเป็นรูปแบบวันที่):

CONCAT(CONCAT(SUBSTR(DATECOL,1,4),SUBSTR(DATECOL,6,2)),SUBSTR(DATECOL,9,2)) AS YYYYMMDD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.