Qu'est-ce que l'opérateur de concaténation de chaînes dans Oracle?

Réponses:

237

C'est ||, par exemple:

select 'Mr ' || ename from emp;

La seule caractéristique «intéressante» à laquelle je puisse penser est que cela 'x' || nullrevient 'x', pas nullcomme on pourrait peut-être s'y attendre.

Tony Andrews
la source
3
J'attendrais null d'une opération logique ... pas sûr que j'aie jamais pensé à une opération de chaîne.
1
Bien sûr, Oracle traite nul et «» comme identiques, et «x» || '' = 'x' a du sens. Mais si vous pensez à null comme "indéfini" ou "inconnu", alors 'x' || null pourrait être n'importe quelle chaîne commençant par 'x' et est donc lui-même "inconnu"!
Tony Andrews
4
||dans Oracle n'est pas un opérateur logique, par conséquent, 'x'||nullretourne x.
Iľja
3
@ipip: Je suis confus - si par "opérateur logique" vous entendez des opérateurs comme AND, NOTetc. alors bien sûr ||n'est pas un opérateur logique. Mais qu'est-ce que cela doit être dû au 'x'||nullretour x? n+nullrenvoie null, donc +un opérateur logique?
Tony Andrews
2
La gestion par Oracle de null dans la concaténation n'est pas standard en ce qu'elle est différente de la spécification SQL92 (et Postgres) - voir postgresql.org/message-id/[email protected]
beldaz
61

Il y a aussi du concat, mais il ne s'utilise pas beaucoup

select concat('a','b') from dual;
Gary Myers
la source
6
c'est bien mieux que le || symbole. utilisant || est juste déroutant selon l'utilisation de || dans une autre langue.
jordan
17
D'accord pour plus de clarté, mais || a l'avantage de permettre plus de 2 terrains facilement
Patrick Honorez
3
CONCATest également compatible avec d'autres SGBD (au moins MySQL et Postgres).
lapo
1
Il est étrange que le comité ANSI SQL n'ait pas pensé que quiconque pourrait avoir besoin de concaténer plus de deux choses. (Il en va de même pour les génies d'Oracle qui ont inventé nvl().)
William Robertson
1
CONCATest également disponible dans Microsoft SQL Server 2012 et versions ultérieures . CONCAT, bien que non standard, est certainement la voie à suivre si vous voulez que votre code soit portable. ( ||est l'opérateur standard ANSI réel, même si vous ne le sauriez pas en regardant le support!)
Matt Gibson
11

Je suggérerais concat lorsqu'il s'agit de 2 chaînes, et || lorsque ces chaînes sont supérieures à 2:

select concat(a,b)
  from dual

ou

  select 'a'||'b'||'c'||'d'
        from dual
Fabio Fantoni
la source
2
désolé, je réalise que c'était il y a 2 ans, mais pourquoi préféreriez-vous concat(a,b)plus a||b?
Tony Andrews
|| plus court, plus flexible et simple. Regardez sa déclaration sélective.
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;

sortie :: Abc def

Ankur
la source
1

L'utilisation a CONCAT(CONCAT(,),)fonctionné pour moi lors de la concaténation de plus de deux chaînes.

Mon problème nécessitait de travailler avec des chaînes de date (uniquement) et de créer à YYYYMMDDpartir YYYY-MM-DDde ce qui suit (c'est-à-dire sans conversion au format de date):

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