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.


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/921.1144705646@sss.pgh.pa.us
beldaz

61

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

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

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

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.