Was ist der String-Verkettungsoperator in Oracle?

Antworten:

236

Es ist ||zum Beispiel:

select 'Mr ' || ename from emp;

Das einzige "interessante" Merkmal, an das ich denken kann, ist die 'x' || nullRückkehr 'x', nicht nullwie Sie vielleicht erwarten.

Tony Andrews
quelle
3
Ich würde von einer logischen Operation null erwarten ... ich bin mir nicht sicher, ob ich jemals über eine Zeichenfolgenoperation nachgedacht habe.
1
Natürlich behandelt Oracle null und '' gleich und 'x' || '' = 'x' macht Sinn. Wenn Sie sich null als "undefiniert" oder "unbekannt" vorstellen, dann ist 'x' || null kann eine beliebige Zeichenfolge sein, die mit 'x' beginnt, und ist daher selbst "unbekannt"!
Tony Andrews
4
||in Oracle ist kein logischer Operator, daher wird 'x'||nullzurückgegeben x.
Iľja
3
@ipip: Ich bin verwirrt - wenn mit "logischem Operator" Operatoren wie usw. gemeint sind AND, NOTdann ist dies natürlich ||kein logischer Operator. Aber was hat das mit der 'x'||nullRückkehr zu tun x? n+nullgibt null zurück, ist also +ein logischer Operator?
Tony Andrews
2
Die Behandlung von Null bei der Verkettung durch Oracle ist nicht standardisiert, da sie sich von der SQL92-Spezifikation (und Postgres) unterscheidet - siehe postgresql.org/message-id/[email protected]
beldaz
61

Es gibt auch concat, aber es wird nicht viel gewöhnt

select concat('a','b') from dual;
Gary Myers
quelle
6
das ist viel besser als das || Symbol. mit || ist nur verwirrend, wie in einer anderen Sprache || verwendet wird.
Jordan
17
Aus Gründen der Klarheit vereinbart, aber || hat den Vorteil, mehr als 2 Felder leicht
zuzulassen
3
CONCATist auch mit anderen DBMS kompatibel (mindestens MySQL und Postgres).
Lapo
1
Seltsam, dass dem ANSI SQL-Komitee nicht der Gedanke gekommen ist, dass jemand mehr als zwei Dinge verketten muss. (Gleiches gilt für die Genies bei Oracle, die sich das ausgedacht haben nvl().)
William Robertson
1
CONCATist auch in Microsoft SQL Server 2012 und höher verfügbar . CONCAT ist zwar kein Standard, aber definitiv der richtige Weg, wenn Sie möchten, dass Ihr Code portabel ist. ( ||ist der eigentliche ANSI-Standardoperator, obwohl Sie es nicht wissen würden, wenn Sie sich die Unterstützung dafür ansehen!)
Matt Gibson
11

Ich würde concat vorschlagen, wenn es um 2 Strings geht, und || wenn diese Zeichenfolgen mehr als 2 sind:

select concat(a,b)
  from dual

oder

  select 'a'||'b'||'c'||'d'
        from dual
Fabio Fantoni
quelle
2
sorry ich weiß , das vor 2 Jahren war, aber warum sollte man es vorziehen , concat(a,b)über a||b?
Tony Andrews
|| kürzer, flexibler und einfacher. Schauen Sie sich seine Select-Anweisung an.
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;

Ausgabe :: Abc def

Ankur
quelle
1

Verwenden von CONCAT(CONCAT(,),) hat bei mir funktioniert, wenn mehr als zwei Zeichenfolgen verkettet wurden.

Mein Problem erforderlich mit Datum Strings arbeiten (nur) und die Schaffung YYYYMMDDvon YYYY-MM-DDwie folgt (dh ohne Datumsformat zu konvertieren):

CONCAT(CONCAT(SUBSTR(DATECOL,1,4),SUBSTR(DATECOL,6,2)),SUBSTR(DATECOL,9,2)) AS YYYYMMDD
Grant Shannon
quelle