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

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

Есть ли какие-нибудь "интересные" особенности, о которых мне следует остерегаться?

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


person AJ.    schedule 10.11.2008    source источник
comment
docs.oracle.com/cd/B19306_01/server.102/ b14200 / operator003.htm   -  person PHPst    schedule 01.05.2014


Ответы (5)


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

select 'Mr ' || ename from emp;

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

person Tony Andrews    schedule 10.11.2008
comment
Я бы ожидал null от логической операции ... не уверен, что когда-либо думал о строковой операции. - person ; 10.11.2008
comment
Конечно, Oracle рассматривает null и '' как одно и то же, а 'x' || '' = 'x' имеет смысл. Но если вы думаете о null как о неопределенном или неизвестном, тогда «x» || null может быть любой строкой, начинающейся с 'x', поэтому он сам по себе неизвестен! - person Tony Andrews; 10.11.2008
comment
|| в Oracle не является логическим оператором, поэтому 'x'||null возвращает x. - person Iľja; 27.06.2012
comment
@ipip: Я запутался - если под логическим оператором вы имеете в виду такие операторы, как AND, NOT и т. д., то, конечно, || не является логическим оператором. Но что это должно быть связано с 'x'||null возвращением x? n+null возвращает ноль, так что + логический оператор? - person Tony Andrews; 20.07.2012
comment
Обработка значения null в объединении в Oracle нестандартна, поскольку отличается от спецификации SQL92 (и Postgres) - см. postgresql.org/message-id/[email protected] - person beldaz; 10.11.2013

Также есть concat, но он мало используется

select concat('a','b') from dual;
person Gary Myers    schedule 10.11.2008
comment
это намного лучше, чем || символ. используя || просто сбивает с толку использование || в других языках. - person jordan; 18.04.2013
comment
Я предпочитаю concat() || для ясности. - person afaulconbridge; 22.07.2013
comment
Это то, что мне было нужно. Хотел использовать его в выражении AND REGEXP_LIKE (CONCAT ( - person Yasen; 23.07.2013
comment
Согласен для ясности, но || имеет то преимущество, что позволяет легко разрешить более 2 полей - person Patrick Honorez; 16.01.2014
comment
CONCAT также совместим с другими СУБД (по крайней мере, MySQL и Postgres). - person lapo; 13.10.2015
comment
Странно, что комитету ANSI SQL не пришло в голову, что кому-то может понадобиться объединить более двух вещей. (То же самое и с гениями из Oracle, придумавшими nvl().) - person William Robertson; 15.11.2015
comment
CONCAT также доступен в Microsoft SQL Server 2012 и более поздних версиях. CONCAT, хотя и нестандартный, определенно подходит, если вы хотите, чтобы ваш код был переносимым. (|| - это фактический стандартный оператор ANSI, хотя вы не узнаете об этом, глядя на его поддержку!) - person Matt Gibson; 31.03.2016
comment
К сожалению, CONCAT () принимает только два аргумента. Вы можете объединить неопределенное количество строк, используя || - person abrittaf; 26.12.2016

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

select concat(a,b)
  from dual

or

  select 'a'||'b'||'c'||'d'
        from dual
person Fabio Fantoni    schedule 11.11.2015
comment
извините, я понимаю, что это было 2 года назад, но почему вы предпочитаете concat(a,b) a||b? - person Tony Andrews; 23.08.2017
comment
|| короче, гибче и проще. Посмотрите на его избранное высказывание. - person JoshYates1980; 02.02.2018

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

person Ankur    schedule 11.11.2015

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

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

CONCAT(CONCAT(SUBSTR(DATECOL,1,4),SUBSTR(DATECOL,6,2)),SUBSTR(DATECOL,9,2)) AS YYYYMMDD
person Grant Shannon    schedule 30.03.2020