Функция CONCAT
Для конкатенации строк в SQL Server используется оператор “+”.
Т.е. если операнды являются числовыми, то выполняется операция сложения, а если – строковыми, то конкатенация:
[[ column ]] |
---|
NULL
[[ value ]] |
Если же операнды являются значениями разных типов, то SQL Server выполняет неявное преобразование типов. Выполняя следующий запрос
[[ column ]] |
---|
NULL
[[ value ]] |
мы получим сообщение об ошибке:
Error converting data type varchar to real.
(Ошибка при преобразовании типа данных varchar к real.)
Существует приоритет типов при их неявном преобразовании, и в соответствии с этим приоритетом сервер пытается преобразовать строку ’ Gb’ к типу данных столбца hd (real).
Разумеется, явное преобразование типа решает проблему:
[[ column ]] |
---|
NULL
[[ value ]] |
В SQL Server 2012 появилась функция CONCAT, которая выполняет конкатенацию, неявно преобразуя типы аргументов к строковому типу данных. С помощью этой функции предыдущий запрос можно переписать так:
[[ column ]] |
---|
NULL
[[ value ]] |
Еще одна полезная особенность функции CONCAT состоит в том, что NULL-значения неявно преобразуются в пустую строку- ‘’. Обычная же конкатенация с NULL-значением дает NULL. Вот пример, который это демонстрирует.
[[ column ]] |
---|
NULL
[[ value ]] |
plus | concat |
---|
NULL | concatenation with NULL |
Следует отметить, что у функции CONCAT может быть произвольное число аргументов, но не менее двух.
[[ column ]] |
---|
NULL
[[ value ]] |
MySQL
В MySQL также имеется функция CONCAT, вернее, даже две функции. Первая из них – CONCAT – возвращает NULL, если среди аргументов функции встречается NULL, вторая – CONCAT_WS – опускает аргумент, если его значение NULL. Кроме того, эта функция первым аргументом имеет разделитель, используемый при конкатенации.
[[ column ]] |
---|
NULL
[[ value ]] |
concat | concat_ws | concat_ws_null |
---|
(NULL) | concatenation with NULL | 1, 2, 4 |
Oracle
В Oracle функция CONCAT имеет только два аргумента, поэтому запрос
[[ column ]] |
---|
NULL
[[ value ]] |
работать не будет. Однако можно применить функцию несколько раз:
[[ column ]] |
---|
NULL
[[ value ]] |
Это, конечно, делает ее менее удобной по сравнению со стандартным способом. Обратите внимание, что при конкатенации чисел выполняется неявное преобразование к символьному типу данных:
[[ column ]] |
---|
NULL
[[ value ]] |
При этом оба метода игнорируют NULL-значения:
[[ column ]] |
---|
NULL
[[ value ]] |
PostgreSQL
Функция CONCAT в PostgreSQL работает так же, как и в SQL Server.
Заметим, что запрос, который работает в Oracle
[[ column ]] |
---|
NULL
[[ value ]] |
будет вызывать ошибку в PostgreSQL, поскольку неявного преобразования типа здесь не происходит. Конкатенировать (стандартным способом) следует символьные значения:
[[ column ]] |
---|
NULL
[[ value ]] |
Еще одним отличием от поведения в Oracle является конкатенация с NULL:
[[ column ]] |
---|
NULL
[[ value ]] |
которая дает NULL:
Рекомендуемые упражнения: 119