Qual é o operador de concatenação de strings no Oracle?

Respostas:

236

É ||, por exemplo:

select 'Mr ' || ename from emp;

A única característica "interessante" em que consigo pensar é que 'x' || nullretorna 'x', não nullcomo você pode esperar.

Tony Andrews
fonte
3
Eu esperaria nulo de uma operação lógica ... não tenho certeza se alguma vez pensei em uma operação de string.
1
Bem, é claro que o Oracle trata nulo e '' como o mesmo, e 'x' || '' = 'x' faz sentido. Mas se você pensa em nulo como "indefinido" ou "desconhecido", então 'x' || null pode ser qualquer string iniciada com 'x' e, portanto, é "desconhecida"!
Tony Andrews
4
||no Oracle não é um operador lógico, portanto, 'x'||nullretorna x.
Ilja
3
@ipip: Estou confuso - se por "operador lógico" você operadores dizer, como AND, NOTetc, então é claro que ||não é um operador lógico. Mas o que isso tem a ver com o 'x'||nullretorno x? n+nullretorna nulo, então é +um operador lógico?
21412 Tony Tonys
2
O manuseio de null na concatenação da Oracle não é padrão, pois é diferente da especificação SQL92 (e Postgres) - consulte postgresql.org/message-id/[email protected]
beldaz
61

Há também concat, mas não se acostuma muito

select concat('a','b') from dual;
Gary Myers
fonte
6
isso é muito melhor que o || símbolo. usando || é apenas confuso conforme o uso de || em outro idioma.
Jordan
17
Acordou por uma questão de clareza, mas || tem a vantagem de permitir que mais de 2 campos facilmente
Patrick Honorez
3
CONCATtambém é compatível com outros DBMSes (pelo menos MySQL e Postgres).
Lapo
1
É estranho que não tenha ocorrido ao comitê ANSI SQL que alguém possa precisar concatenar mais de duas coisas. (O mesmo vale para os gênios da Oracle que vieram acima com nvl().)
William Robertson
1
CONCATtambém está disponível no Microsoft SQL Server 2012 e posteriores . CONCAT, embora não padrão, é definitivamente o caminho a percorrer, se você deseja que seu código seja portátil. ( ||É o operador padrão real ANSI, embora você não saberia que, olhando para o apoio para ele!)
Matt Gibson
11

Eu sugeriria concat ao lidar com 2 strings e || quando essas cadeias são mais de 2:

select concat(a,b)
  from dual

ou

  select 'a'||'b'||'c'||'d'
        from dual
Fabio Fantoni
fonte
2
desculpe, eu perceber que era há 2 anos, mas por que você prefere concat(a,b)mais a||b?
Tony Andrews
|| mais curto, mais flexível e simples. Veja a declaração dele.
precisa saber é o seguinte
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;

saída :: abc def

Ankur
fonte
1

Usando CONCAT(CONCAT(,),) funcionou para mim ao concatenar mais de duas strings.

Meu problema exigia trabalhar com seqüências de datas (apenas) e criar a YYYYMMDDpartir da YYYY-MM-DDseguinte (ou seja, sem converter para o formato de data):

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