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.

Tony Andrews
sumber
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/[email protected]
beldaz
61

Ada juga konser, tetapi tidak banyak digunakan

select concat('a','b') from dual;
Gary Myers
sumber
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
Fabio Fantoni
sumber
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

Ankur
sumber
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
Grant Shannon
sumber