Функция CONCAT
Для конкатенации строк в SQL Server используется оператор “+”.
Т.е. если операнды являются числовыми, то выполняется операция сложения, а если – строковыми, то конкатенация:
SELECT 1+2+3+4 a, '1'+'2'+'3'+'4' b;
[[ column ]] |
---|
[[ value ]] |
a | b |
---|---|
10 | 1234 |
Если же операнды являются значениями разных типов, то SQL Server выполняет неявное преобразование типов. Выполняя следующий запрос
SELECT hd + ' Gb' volume FROM PC WHERE model = 1232;
[[ column ]] |
---|
[[ value ]] |
Существует приоритет типов при их неявном преобразовании, и в соответствии с этим приоритетом сервер пытается преобразовать строку ’ Gb’ к типу данных столбца hd (real).
Разумеется, явное преобразование типа решает проблему:
SELECT CAST(hd AS VARCHAR) + ' Gb' volume FROM PC WHERE model = 1232;
[[ 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;
[[ column ]] |
---|
[[ value ]] |
Еще одна полезная особенность функции CONCAT состоит в том, что NULL-значения неявно преобразуются в пустую строку- ‘’. Обычная же конкатенация с NULL-значением дает NULL. Вот пример, который это демонстрирует.
SELECT NULL + 'concatenation with NULL' plus,
CONCAT(NULL, 'concatenation with NULL') concat;
[[ column ]] |
---|
[[ value ]] |
plus | concat |
---|---|
NULL | concatenation with NULL |
Следует отметить, что у функции CONCAT может быть произвольное число аргументов, но не менее двух.
SELECT 1+2+3+4 a, CONCAT(1, 2, 3, 4) b;
[[ column ]] |
---|
[[ value ]] |
a | b |
---|---|
10 | 1234 |
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;
concat | concat_ws | concat_ws_null |
---|---|---|
(NULL) | concatenation with NULL | 1, 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;
a | b |
---|---|
10 | 1234 |
Это, конечно, делает ее менее удобной по сравнению со стандартным способом. Обратите внимание, что при конкатенации чисел выполняется неявное преобразование к символьному типу данных:
SELECT 1+2+3+4 a, 1 || 2 || 3 || 4 b from dual;
При этом оба метода игнорируют NULL-значения:
SELECT 1 || NULL a, CONCAT(1,NULL) b from dual;
a | b |
---|---|
1 | 1 |
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:
a | b |
---|---|
10 | NULL |
Рекомендуемые упражнения: 119