Что такое оператор конкатенации строк в Oracle?

172

Что такое оператор конкатенации строк в Oracle SQL?

Есть ли какие-нибудь «интересные» особенности, о которых мне следует позаботиться?

(Это кажется очевидным, но я не мог найти предыдущий вопрос, задающий его).

AJ.
источник

Ответы:

237

Это ||, например:

select 'Mr ' || ename from emp;

Единственная «интересная» особенность, о которой я могу подумать, - это 'x' || nullвозврат 'x', не nullтакой , как вы, возможно, ожидаете.

Тони Эндрюс
источник
3
Я ожидаю, что null от логической операции ... не уверен, что когда-либо думал о строковой операции.
1
Ну, конечно, Oracle обрабатывает нуль и '' как одно и то же, а 'x' || '' = 'x' имеет смысл. Но если вы думаете о нуле как о «неопределенном» или «неизвестном», тогда «x» || null может быть любой строкой, начинающейся с 'x', и поэтому сама является "неизвестной"!
Тони Эндрюс
4
||в Oracle не является логическим оператором, поэтому 'x'||nullвозвращает x.
Илья
3
@ipip: я в замешательстве - если под «логическим оператором» вы подразумеваете такие операторы, как ANDи NOTт. д., то, конечно, ||это не логический оператор. Но какое это имеет отношение к 'x'||nullвозвращению x? n+nullвозвращает ноль, так +что логический оператор?
Тони Эндрюс
2
Обработка Oracle в нуль в конкатенации не является стандартом в том , что она отличается от SQL92 спецификации (и Postgres) - см postgresql.org/message-id/921.1144705646@sss.pgh.pa.us
beldaz
61

Есть также конкат, но он мало привык

select concat('a','b') from dual;
Гэри Майерс
источник
6
это намного лучше, чем || условное обозначение. используя || просто сбивает с толку, как в других языках использования ||.
Иордания
17
Договорились для ясности, но || имеет преимущество, позволяющее легко использовать более 2 полей
Патрик Хонорез
3
CONCATтакже совместим с другими СУБД (по крайней мере, MySQL и Postgres).
Lapo
1
Странно, что комитету ANSI SQL не пришло в голову, что кому-то может понадобиться объединить более двух вещей. (То же самое касается гениев в Oracle, которые придумали nvl().)
Уильям Робертсон
1
CONCATтакже доступен в Microsoft SQL Server 2012 и более поздних версиях . CONCAT, хотя и нестандартный, безусловно, является подходящим вариантом, если вы хотите, чтобы ваш код был переносимым. ( ||является действительным стандартным оператором ANSI, хотя вы не узнаете об этом, если посмотрите на его поддержку!)
Мэтт Гибсон,
11

Я бы предложил concat при работе с 2 строками, а || когда этих строк больше 2:

select concat(a,b)
  from dual

или

  select 'a'||'b'||'c'||'d'
        from dual
Фабио Фантони
источник
2
извините, я понимаю, что это было 2 года назад, но почему вы предпочитаете concat(a,b)более a||b?
Тони Эндрюс
|| короче, гибче и проще. Посмотрите на его выбор заявления.
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;

output :: Abc def

Анкур
источник
1

Использование CONCAT(CONCAT(,),)сработало для меня при объединении более двух строк.

Моя проблема требовала работы со строками даты (только) и создания YYYYMMDDиз YYYY-MM-DDследующего (т.е. без преобразования в формат даты):

CONCAT(CONCAT(SUBSTR(DATECOL,1,4),SUBSTR(DATECOL,6,2)),SUBSTR(DATECOL,9,2)) AS YYYYMMDD
Грант Шеннон
источник