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


172

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

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

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


Ответы:


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.