Apa yang dimaksud dengan operator rangkaian string di Oracle?


Jawaban:


237

Hal ini ||, misalnya:

select 'Mr ' || ename from emp;

Satu-satunya fitur "menarik" yang bisa saya pikirkan adalah yang 'x' || nullkembali 'x', tidak nullseperti yang mungkin Anda harapkan.


3
Saya harapkan nol dari operasi logis ... tidak yakin saya pernah berpikir tentang operasi string.

1
Yah tentu saja Oracle memperlakukan null dan '' sama, dan 'x' || '' = 'x' masuk akal. Tetapi jika Anda menganggap null sebagai "tidak terdefinisi" atau "tidak dikenal" maka 'x' || null bisa berupa sembarang string yang diawali dengan 'x' dan jadi itu sendiri "tidak diketahui"!
Tony Andrews

4
||di Oracle bukan operator yang logis, karena itu, 'x'||nullkembali x.
Iľja

3
@ipip: Saya bingung - jika dengan "operator logis" yang Anda maksud adalah operator AND, NOTdll. tentu saja ||bukan operator yang logis. Tetapi apa yang harus terjadi karena 'x'||nullkembali x? n+nullmengembalikan null, jadi apakah +operator logis?
Tony Andrews

2
Penanganan Oracle terhadap null dalam rangkaian adalah tidak standar karena berbeda dengan spesifikasi SQL92 (dan Postgres) - lihat postgresql.org/message-id/921.1144705646@sss.pgh.pa.us
beldaz

61

Ada juga konser, tetapi tidak banyak digunakan

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

6
ini jauh lebih baik daripada || simbol. menggunakan || hanya membingungkan sesuai penggunaan bahasa lain dari ||.
jordan

17
Setuju untuk kejelasan, tetapi || memiliki keunggulan untuk memungkinkan lebih dari 2 bidang dengan mudah
Patrick Honorez

3
CONCATjuga kompatibel dengan DBMS lain (setidaknya MySQL dan Postgres).
Lapo

1
Aneh bahwa itu tidak terjadi pada komite SQL ANSI bahwa siapa pun mungkin perlu menyatukan lebih dari dua hal. (Hal yang sama berlaku untuk para genius di Oracle yang datang dengan nvl().)
William Robertson

1
CONCATjuga tersedia di Microsoft SQL Server 2012 dan seterusnya . CONCAT, meskipun tidak standar, jelas merupakan cara untuk pergi jika Anda ingin kode Anda portabel. ( ||adalah operator standar ANSI yang sebenarnya, meskipun Anda tidak akan mengetahuinya dengan melihat dukungan untuk itu!)
Matt Gibson

11

Saya akan menyarankan concat ketika berhadapan dengan 2 string, dan || ketika string itu lebih dari 2:

select concat(a,b)
  from dual

atau

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

2
maaf saya menyadari ini adalah 2 tahun yang lalu, tapi mengapa Anda lebih memilih concat(a,b)lebih a||b?
Tony Andrews

|| lebih pendek, lebih fleksibel, dan sederhana. Lihatlah pernyataan pilihnya.
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;

output :: Abc def


1

Menggunakan CONCAT(CONCAT(,),)bekerja untuk saya ketika menggabungkan lebih dari dua string.

Masalah saya diperlukan bekerja dengan string tanggal (hanya) dan membuat YYYYMMDDdari YYYY-MM-DDsebagai berikut (yaitu tanpa mengkonversi ke format tanggal):

CONCAT(CONCAT(SUBSTR(DATECOL,1,4),SUBSTR(DATECOL,6,2)),SUBSTR(DATECOL,9,2)) AS YYYYMMDD
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.