Функция CONCAT

Для конкатенации строк в SQL Server используется оператор “+”.

Т.е. если операнды являются числовыми, то выполняется операция сложения, а если – строковыми, то конкатенация:

SELECT 1+2+3+4 a, '1'+'2'+'3'+'4' b;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
ab
101234

Если же операнды являются значениями разных типов, то SQL Server выполняет неявное преобразование типов. Выполняя следующий запрос

SELECT hd + ' Gb' volume FROM PC WHERE model = 1232;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
мы получим сообщение об ошибке:

Error converting data type varchar to real. (Ошибка при преобразовании типа данных varchar к real.)

Существует приоритет типов при их неявном преобразовании, и в соответствии с этим приоритетом сервер пытается преобразовать строку ’ Gb’ к типу данных столбца hd (real).

Разумеется, явное преобразование типа решает проблему:

SELECT CAST(hd AS VARCHAR) + ' Gb' volume FROM PC WHERE model = 1232;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
volume
5 Gb
10 Gb
8 Gb
10 Gb

В SQL Server 2012 появилась функция CONCAT, которая выполняет конкатенацию, неявно преобразуя типы аргументов к строковому типу данных. С помощью этой функции предыдущий запрос можно переписать так:

SELECT CONCAT(hd, ' Gb') volume FROM PC WHERE model=1232;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]

Еще одна полезная особенность функции CONCAT состоит в том, что NULL-значения неявно преобразуются в пустую строку- ‘’. Обычная же конкатенация с NULL-значением дает NULL. Вот пример, который это демонстрирует.

SELECT NULL + 'concatenation with NULL' plus,
               CONCAT(NULL, 'concatenation with NULL') concat;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
plusconcat
NULLconcatenation with NULL

Следует отметить, что у функции CONCAT может быть произвольное число аргументов, но не менее двух.

SELECT 1+2+3+4 a, CONCAT(1, 2, 3, 4) b;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
ab
101234

MySQL

В MySQL также имеется функция CONCAT, вернее, даже две функции. Первая из них – CONCAT – возвращает NULL, если среди аргументов функции встречается NULL, вторая – CONCAT_WS – опускает аргумент, если его значение NULL. Кроме того, эта функция первым аргументом имеет разделитель, используемый при конкатенации.

SELECT CONCAT(NULL, 'concatenation with NULL') concat,
 CONCAT_WS('',NULL, 'concatenation with NULL') concat_ws,
CONCAT_WS(', ',1, 2, NULL, 4) concat_ws_null;
concatconcat_wsconcat_ws_null
(NULL)concatenation with NULL1, 2, 4

Oracle

В Oracle функция CONCAT имеет только два аргумента, поэтому запрос

SELECT 1+2+3+4 a, CONCAT(1, 2, 3, 4) b from dual;

работать не будет. Однако можно применить функцию несколько раз:

SELECT 1+2+3+4 a, CONCAT(CONCAT(1, 2), CONCAT(3, 4)) b from dual;
ab
101234

Это, конечно, делает ее менее удобной по сравнению со стандартным способом. Обратите внимание, что при конкатенации чисел выполняется неявное преобразование к символьному типу данных:

SELECT 1+2+3+4 a, 1 || 2 || 3 || 4 b from dual;

При этом оба метода игнорируют NULL-значения:

SELECT 1 || NULL a, CONCAT(1,NULL) b from dual;
ab
11

PostgreSQL

Функция CONCAT в PostgreSQL работает так же, как и в SQL Server.

Заметим, что запрос, который работает в Oracle

SELECT 1+2+3+4 a, 1 || 2 || 3 || 4 b;

будет вызывать ошибку в PostgreSQL, поскольку неявного преобразования типа здесь не происходит. Конкатенировать (стандартным способом) следует символьные значения:

SELECT 1+2+3+4 a, '1' || '2' || '3' || '4' b;

Еще одним отличием от поведения в Oracle является конкатенация с NULL:

SELECT 1+2+3+4 a, '1' || '2' || '3' || NULL b;

которая дает NULL:

ab
10NULL

Рекомендуемые упражнения:  119