loading..
Русский    English
12:48
листать

Функция CONCAT

Для конкатенации строк в  Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server используется оператор "+".

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

Консоль
Выполнить
  1. SELECT 1+2+3+4 a, '1'+'2'+'3'+'4' b;

a    b
10    1234

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

Консоль
Выполнить
  1. SELECT hd + ' Gb' volume FROM PC WHERE model = 1232;
мы получим сообщение об ошибке:

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

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

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

Консоль
Выполнить
  1. SELECT CAST(hd AS VARCHAR) + ' Gb' volume FROM PC WHERE model = 1232;

volume
5 Gb
10 Gb
8 Gb
10 Gb

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

Консоль
Выполнить
  1. SELECT CONCAT(hd, ' Gb') volume FROM PC WHERE model=1232;

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

Консоль
Выполнить
  1. SELECT NULL + 'concatenation with NULL' plus,
  2.                CONCAT(NULL, 'concatenation with NULL') concat;

plus    concat
NULL    concatenation with NULL

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

Консоль
Выполнить
  1. SELECT 1+2+3+4 a, CONCAT(1, 2, 3, 4) b;

a    b
10    1234

MySQL

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

  1. SELECT CONCAT(NULL, 'concatenation with NULL') concat,
  2.  CONCAT_WS('',NULL, 'concatenation with NULL') concat_ws,
  3. 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 имеет только два аргумента, поэтому запрос

  1. SELECT 1+2+3+4 a, CONCAT(1, 2, 3, 4) b FROM dual;
работать не будет. Однако можно применить функцию несколько раз:

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

a    b
10    1234

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

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

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

  1. SELECT 1 || NULL a, CONCAT(1,NULL) b FROM dual;

a    b
1    1

PostgreSQL

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

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

  1. SELECT 1+2+3+4 a, 1 || 2 || 3 || 4 b;
будет вызывать ошибку в PostgreSQL, поскольку неявного преобразования типа здесь не происходит. Конкатенировать (стандартным способом) следует символьные значения:

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

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

  1. SELECT 1+2+3+4 a, '1' || '2' || '3' || NULL b;
которая дает NULL:

a    b
10    NULL


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

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.