¿Cuál es el operador de concatenación de cadenas en Oracle?

Respuestas:

237

Es ||, por ejemplo:

select 'Mr ' || ename from emp;

La única característica "interesante" que se me ocurre es que 'x' || nullregresa 'x', no nullcomo se podría esperar.

Tony Andrews
fuente
3
Esperaría nulo de una operación lógica ... no estoy seguro de haber pensado alguna vez en una operación de cadena.
1
Bueno, por supuesto, Oracle trata nulo y '' como lo mismo, y 'x' || '' = 'x' tiene sentido. Pero si piensa en nulo como "indefinido" o "desconocido", entonces 'x' || nulo podría ser cualquier cadena que comience con 'x' y, por lo tanto, es "desconocida".
Tony Andrews
44
||en Oracle no es un operador lógico, por lo tanto, 'x'||nulldevuelve x.
Iľja
3
@ipip: Estoy confundido: si por "operador lógico" te refieres a operadores como AND, NOTetc., por supuesto, ||no es un operador lógico. Pero, ¿qué tiene eso que ver con el 'x'||nullregreso x? n+nulldevuelve nulo, entonces ¿es +un operador lógico?
Tony Andrews
2
El manejo de Oracle de nulo en la concatenación no es estándar, ya que es diferente a la especificación SQL92 (y Postgres) - vea postgresql.org/message-id/[email protected]
beldaz
61

También hay concat, pero no se usa mucho

select concat('a','b') from dual;
Gary Myers
fuente
66
esto es mucho mejor que el || símbolo. utilizando || es confuso según el uso de || de otro idioma.
jordan
17
Acordado por la claridad, pero || tiene la ventaja de permitir más de 2 campos fácilmente
Patrick Honorez
3
CONCATTambién es compatible con otros DBMS (al menos MySQL y Postgres).
lapo
1
Es extraño que no se le ocurriera al comité ANSI SQL que alguien podría necesitar concatenar más de dos cosas. (Lo mismo ocurre con los genios de Oracle que se les ocurrió nvl())
William Robertson,
1
CONCATtambién está disponible en Microsoft SQL Server 2012 y en adelante . CONCAT, aunque no estándar, es definitivamente el camino a seguir si desea que su código sea portátil. ( ||es el operador estándar ANSI real, ¡aunque no lo sabrías si buscas el soporte!)
Matt Gibson
11

Sugeriría concat cuando se trata de 2 cadenas, y || cuando esas cadenas son más de 2:

select concat(a,b)
  from dual

o

  select 'a'||'b'||'c'||'d'
        from dual
Fabio Fantoni
fuente
2
lo siento, me doy cuenta de que esto fue hace 2 años, pero ¿por qué preferirías concat(a,b)hacerlo a||b?
Tony Andrews el
|| más corto, más flexible y simple. Mira su declaración selecta.
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;

salida :: Abc def

Ankur
fuente
1

El uso CONCAT(CONCAT(,),)funcionó para mí al concatenar más de dos cadenas.

Mi problema requería trabajar con cadenas de fecha (solo) y crear YYYYMMDDde la YYYY-MM-DDsiguiente manera (es decir, sin convertir al formato de fecha):

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