Що таке оператор конкатенації рядків в Oracle?


172

Що таке оператор конкатенації рядків в Oracle SQL?

Чи є якісь "цікаві" особливості, над якими я повинен бути обережним?

(Це здається очевидним, але я не зміг знайти попереднє запитання).


Відповіді:


237

Це ||, наприклад:

select 'Mr ' || ename from emp;

Єдина «цікава» особливість, яку я можу придумати, - це те, що 'x' || nullповертається 'x', а не так, nullяк можна було б очікувати.


3
Я очікував би нульової логічної операції ... не впевнений, що коли-небудь думав про строкову операцію.

1
Ну і звичайно Oracle трактує null і '' як те саме, і 'x' || '' = 'x' має сенс. Але якщо ви вважаєте, що null є "невизначеним" або "невідомим", тоді 'x' || null може бути будь-яким рядком, що починається з "x", і так само "невідомо"!
Тоні Ендрюс

4
||в Oracle не є логічним оператором, тому 'x'||nullповертається x.
Іджа

3
@ipip: Я збентежений - якщо під "логічним оператором" ви маєте на увазі операторів, як ANDі NOTт.д., то, звичайно, ||це не логічний оператор. Але з чим це пов'язане з 'x'||nullповерненням x? n+nullповертає 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
Домовилися для ясності, але || має перевагу в тому, щоб легко отримати більше двох полів
Патрік Онорез

3
CONCATтакож сумісний з іншими СУБД (принаймні MySQL та Postgres).
lapo

1
Як не дивно, що комітету ANSI SQL не траплялося, що комусь може знадобитися об'єднати більше двох речей. (Те саме стосується геніїв в Oracle, які придумали nvl().)
Вільям Робертсон

1
CONCATтакож доступний в Microsoft SQL Server 2012 і далі . CONCAT, хоч і нестандартний, - це, безумовно, шлях, якщо ви хочете, щоб ваш код був переносним. ( ||це фактичний стандартний оператор ANSI, хоча ви цього не знаєте, дивлячись на підтримку!)
Мет Гібсон

11

Я б запропонував конкомат, коли йдеться про 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;

вихід :: 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.