Oracle'da dize birleştirme operatörü nedir?


Yanıtlar:


237

Öyle ||örneğin,:

select 'Mr ' || ename from emp;

Düşünebildiğim tek "ilginç" özellik , belki de beklediğiniz gibi değil , 'x' || nullgeri dönüşler .'x'null


3
Mantıksal bir işlemden null beklerdim ... bir string işlemi hakkında hiç düşünmediğimden emin değilim.

1
Tabii ki Oracle null ve '' işlevlerini aynı şekilde ele alıyor ve 'x' || '' = 'x' mantıklı. Ama null değerini "undefined" veya "unknown" olarak düşünüyorsanız, 'x' || null, 'x' ile başlayan herhangi bir dize olabilir ve kendisi de "bilinmiyor" dır!
Tony Andrews

4
||Oracle'da mantıksal bir operatör değildir, bu nedenle 'x'||nullgeri döner x.
Junja

3
@ipip: Kafam karıştı - eğer "mantıksal operatör" ile AND, NOTvb. gibi operatörleri kastediyorsanız , elbette ||mantıklı bir operatör değildir. Ama bunun 'x'||nullgeri dönmeyle ne ilgisi var x? n+nullnull değerini döndürür, bu yüzden +mantıksal bir operatör mü?
Tony Andrews

2
Oracle'ın birleştirme sırasında null kullanımı, SQL92 spesifikasyonundan (ve Postgres'ten) farklı olması nedeniyle standart değildir - bkz. Postgresql.org/message-id/921.1144705646@sss.pgh.pa.us
beldaz

61

Ayrıca concat var, ama çok fazla kullanılmıyor

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

6
bu || sembolü. || sadece diğer dillerin ||
Ürdün

17
Anlaşılırlık için anlaştılar ama || 2'den fazla alana kolayca izin verme avantajına sahiptir
Patrick Honorez

3
CONCATdiğer DBMS'lerle de uyumludur (en azından MySQL ve Postgres).
lapo

1
Herkesin ikiden fazla şeyi birleştirmesi gerekebileceği ANSI SQL komitesinde görülmedi. (Aynı şey Oracle'da ortaya çıkan dahiler için de geçerli nvl().)
William Robertson

1
CONCATMicrosoft SQL Server 2012 ve sonrasında da mevcuttur . CONCAT, standart olmasa da, kodunuzun taşınabilir olmasını istiyorsanız kesinlikle gitmenin yoludur. ( ||asıl ANSI standart operatörüdür, ancak desteğe bakarak bilmezsiniz!)
Matt Gibson

11

2 dizeleri ile uğraşırken concat öneririm ve || bu dizeler 2'den fazla olduğunda:

select concat(a,b)
  from dual

veya

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

2
üzgünüm, bunun 2 yıl önce olduğunu fark ettim, ama neden tercih concat(a,b)edesin a||b?
Tony Andrews

|| daha kısa, daha esnek ve basit. Seçme ifadesine bakın.
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;

çıktı :: Abc def


1

CONCAT(CONCAT(,),)İkiden fazla dizeyi birleştirirken kullanmak benim için çalıştı.

Benim sorunum (yalnızca) tarih dizeleri ile çalışan ve oluşturma gerekli YYYYMMDDdan YYYY-MM-DD(yani tarih biçimini değiştirmeden) şöyle:

CONCAT(CONCAT(SUBSTR(DATECOL,1,4),SUBSTR(DATECOL,6,2)),SUBSTR(DATECOL,9,2)) AS YYYYMMDD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.