Sql Scholl
Распечатать страницу
Перейти на главную Карта сайта Отправить сообщение

Вычисляемые поля

Конкатенация полей

     Чтобы продемонстрировать работу вычисляемых полей, рассмотрим простой пример — создание заголовка, состоящего из двух столбцов.

     В таблице Vendors содержится название поставщика и его адрес. Предположим, что вам необходимо создать отчет по поставщику и указать его адрес как часть его имени в виде имя (адрес). 

     В отчете должно быть одно значение, а данные в таблице хранятся в двух столбцах: vend_name и vend_country. Кроме того, значение vend_country необходимо заключить в скобки, которых нет в таблице базы данных. Выражение SELECT, которое возвращает имена поставщиков и адреса, довольно простое, но как создать комбинированное значение?

Конкатенация

Комбинирование значений (путем присоединения их друг к другу) для получения одного "длинного" значения.

 

     Для этого необходимо соединить два значения. В SQL-выражении SELECT можно выполнить конкатенацию двух столбцов при помощи специального оператора. В зависимости от СУБД это может быть знак "плюс" (+) или две вертикальные черточки (||).

Оператор + или ||

В СУБД Access, SQL Server и Sybase для конкатенации используется знак +. В СУБД DB2, Oracle, PostgreSQL и Sybase используется знак ||. Более подробную информацию ищите в документации по вашей СУБД. Вообще-то || — более предпочтительный оператор конкатенации, так что он поддерживается все большим и большим количеством СУБД.

      Ниже приведен пример использования знака "плюс" (применяется синтаксис, принятый в большинстве СУБД):

SELECT vend_name + ' (' + vend_country + ')'
FROM Vendors
ORDER BY vend_name; 



------------------------    ----------------------
Bear Emporium               (USA                  )
Beras R Us                  (USA                  )
Doll House Inc.             (USA                  )
Fun and Games               (England              )
Furball Inc.                (USA                  )
Jouets et ours              (France               )

   Ниже приведена та же инструкция, но с использованием оператора ||:

SELECT vend_name || '(' || vend_country || ')'
FROM Vendors
ORDER BY vend_name; 



------------------------    ----------------------
Bear Emporium               (USA                  )
Beras R Us                  (USA                  )
Doll House Inc.             (USA                  )
Fun and Games               (England              )
Furball Inc.                (USA                  )
Jouets et ours              (France               )

     В предыдущих операторах SELECT была выполнена конкатенация следующих элементов:

  • имя, хранящееся в столбце vend_name;
  • строка, содержащая пробел и открывающую круглую скобку;
  • название штата, хранящееся в столбце vend_country; 
  • строка, содержащая закрывающую круглую скобку.

     Как видно из приведенного выше результата, выражение SELECT возвращает один столбец (вычисляемое поле), содержащий все четыре элемента как одно целое.

Конкатенация в MySQL

В MySQL не поддерживается конкатенация при помощи оператора + или | |. Здесь необходимо использовать функцию CONCAT (), в которой указывается список элементов, по отношению к которым необходимо выполнить конкатенацию. При использовании функции CONCAT () первая строка примера выглядела бы так:

SELECT CONCAT(vend_name, ' (", vend_country, ')')
В MySQL поддерживается использование оператора | |, но не для конкатенации. В MySQL | | является эквивалентом логического оператора OR, а &&— эквивалентом логического оператора AND.

     Взгляните еще раз на результат, полученный после применения оператора SELECT. Два столбца, объединенные в вычисляемое поле, заполнены пробелами. Во многих базах данных (но не во всех) сохраненный текст дополняется пробелами до ширины столбца. Чтобы выбрать правильно отформатированные данные, необходимо убрать добавленные пробелы. Это можно сделать при помощи SQL-функции RTRIM() следующим образом:

SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
FROM Vendors
ORDER BY vend_name; 


---------------------------------------------
Bear Emporium (USA)
Beras R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

     Ниже приведено это же выражение, но с использованием оператора | |:

SELECT RTRIM(vend_name) || '(' || RTRIM(vend_country) || ')'
FROM Vendors
ORDER BY vend_name;



Bear Emporium (USA)
Beras R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

     Функция RTRIM () отбрасывает все пробелы справа от указанного значения. При использовании функции RTRIM () каждый отдельный столбец обрабатывается корректно. Город, штат указываются через запятую и пробел, а штат и ZIP-код — через пробел.

Функции TRIM

В большинстве СУБД поддерживаются как функция RTRIM () (которая, как мы увидели, "обрезает" правую часть строки), так и LTRIM () (которая удаляет левую часть строки), а также TRIM ()(которая "обрезает" строку слева и справа).