Сочетание строковых функций на Transact-SQL. Строковые функции Sql Sql добавить символы в начало строки
В другие. Она имеет следующий синтаксис:
CONV(число,N,M)
Аргумент число находится в системе счисления с основанием N. Функция переводит его в систему счисления с основанием M и возвращает значение в виде строки.
Пример 1
Следующий запрос переводит число 2 из десятичной системы счисления в двоичную:
SELECT CONV(2,10,2);
Результат: 10
Для перевода числа 2E из шестнадцатиричной системы в десятичную требуется запрос:
SELECT CONV("2E",16,10);
Результат: 46
Функция CHAR() переводит ASCII-код в строки. Она имеет следующий синтаксис:
CHAR(n1,n2,n3..)
Пример 2
SELECT CHAR(83,81,76);
Результат: SQL
Следующие функции возвращают длину строки:
- LENGTH(строка);
- OCTET_LENGTH(строка);
- CHAR_LENGTH(строка);
- CHARACTER_LENGTH(строка).
Пример 3
SELECT LENGTH("MySQL");
Результат: 5
Иногда бывает полезной функция BIT_LENGTH(строка) , которая возвращает длину строки в битах.
Пример 4
SELECT BIT_LENGTH("MySQL");
Результат: 40
Функции работы с подстроками
Подстрокой обычно называют часть строки. Часто требуется узнать позицию первого вхождения подстроки в строку. Эту задачу в MySQL решают три функции:
- LOCATE(подстрока, строка [,позиция]);
- POSITION(подстрока, строка);
- INSTR(строка, подстрока).
Если подстрока не содержится в строке, то все три функции возвращают значение 0. Функция INSTR() отличается от двух других порядком аргументов. Функция LOCATE() может содержать третий аргумент позиция , который позволяет искать подстроку в строке не с начала, а с указанной позиции.
Пример 5
SELECT LOCATE("Топаз", "открытое акционерное общество Топаз");
Результат: 31
SELECT POSITION("Топаз", "открытое акционерное общество Топаз");
Результат: 31
SELECT INSTR("открытое акционерное общество Топаз",’Топаз’);
Результат: 31
SELECT LOCATE("Топаз", " Завод Топаз и ООО Топаз", 9);
Результат: 20
SELECT LOCATE("Алмаз", "открытое акционерное общество Топаз");
Результат: 0
Функции LEFT(строка, N) и RIGHT(строка, N) возвращают соответственно крайние левые и крайние правые N символов в строке.
Пример 6
SELECT LEFT("СУБД MySQL", 4);
Результат: СУБД
SELECT RIGHT("СУБД MySQL", 5);
Результат: MySQL
Иногда требуется получить подстроку, которая начинается с некоторой заданной позиции. Для этого используются функции:
- SUBSTRING(строка, позиция, N);
- MID(строка, позиция, N).
Обе функции возвращают N символов заданной строки, расположенных начиная с указанной позиции.
Пример 7
SELECT SUBSTRING("СУБД MySQL - одна из самых популярных СУБД", 6,5);
Результат: MySQL
При работе с электронными адресами и адресами сайтов очень полезна функция SUBSTR_INDEX() . Функция имеет три аргумента:
SUBSTR_INDEX(строка, разделитель, N).
Аргумент N может быть положительным или отрицательным. Если он отрицательный, то функция находит N-ое вхождение разделителя, если считать справа. После чего возвращает подстроку, расположенную справа от найденного разделителя. Если N положительно, то функция находит N-ое вхождение разделителя слева и возвращает подстроку, расположенную слева от найденного разделителя.
Пример 8
SELECT SUBSTRING_INDEX("www.mysql.ru",".",2);
Результат: www.mysql
SELECT SUBSTRING_INDEX("www.mysql.ru",".",-2);
Результат: mysql.ru
Функция REPLACE(строка,подстрока1,подстрока2) позволяет заменить в строке все вхождения подстроки1 на подстроку2.
Последнее обновление: 29.07.2017
Для работы со строками в T-SQL можно применять следующие функции:
LEN : возвращает количество символов в строке. В качестве параметра в функцию передается строка, для которой надо найти длину:
SELECT LEN("Apple") -- 5
LTRIM : удаляет начальные пробелы из строки. В качестве параметра принимает строку:
SELECT LTRIM(" Apple")
RTRIM : удаляет конечные пробелы из строки. В качестве параметра принимает строку:
SELECT RTRIM(" Apple ")
CHARINDEX : возвращает индекс, по которому находится первое вхождение подстроки в строке. В качестве первого параметра передается подстрока, а в качестве второго - строка, в которой надо вести поиск:
SELECT CHARINDEX("pl", "Apple") -- 3
PATINDEX : возвращает индекс, по которому находится первое вхождение определенного шаблона в строке:
SELECT PATINDEX("%p_e%", "Apple") -- 3
LEFT : вырезает с начала строки определенное количество символов. Первый параметр функции - строка, а второй - количество символов, которые надо вырезать сначала строки:
SELECT LEFT("Apple", 3) -- App
RIGHT : вырезает с конца строки определенное количество символов. Первый параметр функции - строка, а второй - количество символов, которые надо вырезать сначала строки:
SELECT RIGHT("Apple", 3) -- ple
SUBSTRING : вырезает из строки подстроку определенной длиной, начиная с определенного индекса. Певый параметр функции - строка, второй - начальный индекс для вырезки, и третий параметр - количество вырезаемых символов:
SELECT SUBSTRING("Galaxy S8 Plus", 8, 2) -- S8
REPLACE : заменяет одну подстроку другой в рамках строки. Первый параметр функции - строка, второй - подстрока, которую надо заменить, а третий - подстрока, на которую надо заменить:
SELECT REPLACE("Galaxy S8 Plus", "S8 Plus", "Note 8") -- Galaxy Note 8
REVERSE : переворачивает строку наоборот:
SELECT REVERSE("123456789") -- 987654321
CONCAT : объединяет две строки в одну. В качестве параметра принимает от 2-х и более строк, которые надо соединить:
SELECT CONCAT("Tom", " ", "Smith") -- Tom Smith
LOWER : переводит строку в нижний регистр:
SELECT LOWER("Apple") -- apple
UPPER : переводит строку в верхний регистр
SELECT UPPER("Apple") -- APPLE
SPACE : возвращает строку, которая содержит определенное количество пробелов
Например, возьмем таблицу:
CREATE TABLE Products (Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);
И при извлечении данных применим строковые функции:
SELECT UPPER(LEFT(Manufacturer,2)) AS Abbreviation, CONCAT(ProductName, " - ", Manufacturer) AS FullProdName FROM Products ORDER BY Abbreviation
Функции языка Transact-SQL могут быть агрегатными или скалярными. Эти типы функций рассматриваются в этой статье.
Агрегатные функции
Агрегатные функции выполняют вычисления над группой значений столбца и всегда возвращают одно значение результата этих вычислений. Язык Transact-SQL поддерживает несколько обычных агрегатных функций:
AVGВычисляет среднее арифметическое значение данных, содержащихся в столбце. Значения, над которыми выполняется вычисление, должны быть числовыми.
MIN и MAXОпределяют максимальное и минимальное значение из всех значений данных, содержащихся в столбце. Значения могут быть числовыми, строковыми или временными (дата/время).
SUMВычисляет общую сумму значений в столбце. Значения, над которыми выполняется вычисление, должны быть числовыми.
COUNTПодсчитывает количество значений, отличных от null в столбце. Функция count(*) является единственной агрегатной функцией, которая не выполняет вычисления над столбцами. Эта функция возвращает количество строк (независимо от того, содержат ли отдельные столбцы значения null).
COUNT_BIGАналогична функции count, с той разницей, что возвращает значение данных типа BIGINT.
Использование обычных агрегатных функций в инструкции SELECT будет рассматриваться в одной из следующих статей.
Скалярные функции
Скалярные функции Transact-SQL используются в создании скалярных выражений. (Скалярная функция выполняет вычисления над одним значением или списком значений, тогда как агрегатная функция выполняет вычисления над группой значений из нескольких строк.) Скалярные функции можно разбить на следующие категории:
числовые функции;
функции даты;
строковые функции;
системные функции;
функции метаданных.
Эти типы функций рассматриваются в последующих разделах.
Числовые функции
Числовые функции языка Transact-SQL - это математические функции для модифицирования числовых значений. Список числовых функций и их краткое описание приводится в таблице ниже:
Функция | Синтаксис | Описание | Пример использования |
---|---|---|---|
ABS | ABS(n) | Возвращает абсолютное значение (т. е. отрицательные значения возвращаются, как положительные) числового выражения n. |
SELECT ABS(-5.320) -- Вернет 5.320 SELECT ABS(8.90) -- Вернет 8.90 |
ACOS, ASIN, ATAN, ATN2 | ACOS(n), ASIN(n), ATAN(n), ATN2(n, m) | Обратные тригонометрические функции, вычисляющие арккосинус, арксинус, арктангенс значения n (для ATN2 вычисляется арктангенс n/m). Исходные значения n, m и результат имеют тип данных FLOAT. |
|
COS, SIN, TAN, COT | COS(n), SIN(n), TAN(n), COT(n) | Тригонометрические функции, вычисляющие косинус, синус, тангенс, котангенс значения n. Результат имеет тип данных FLOAT. |
|
DEGREES, RADIANS | DEGREES(n), RADIANS(n) | Функция DEGREES преобразует радианы в градусы, RADIANS соответственно наоборот. |
SELECT DEGREES(PI() / 4) -- Вернет 45 SELECT COS(RADIANS(60.0)) -- Вернет 0.5 |
CEILING | CEILING(n) | Округляет число до большего целого значения. |
SELECT CEILING(-5.320) -- Вернет -5 SELECT CEILING(8.90) -- Вернет 9 |
ROUND | ROUND(n, p, [t]) | Округляет значение n с точностью до p. Когда аргумент p положительное число, округляется дробная часть числа n, а когда отрицательное - целая часть. При использовании необязательного аргумента t, число n не округляется, а усекается (т.е. округляется в меньшую сторону). |
SELECT ROUND(5.3208, 3) -- Вернет 5.3210 SELECT ROUND(125.384, -1) -- Вернет 130.000 SELECT ROUND(125.384, -1, 1) -- Вернет 120.000 |
FLOOR | FLOOR(n) | Округляет до меньшего целого значения. |
SELECT FLOOR(5.88) -- Вернет 5 |
EXP | EXP(n) | Вычисляет значение e n . |
|
LOG, LOG10 | LOG(n), LOG10(n) | LOG(n) - вычисляет натуральный логарифм (т.е. с основанием e) числа n, LOG10(n) - вычисляет десятичный (с основанием 10) логарифм числа n. |
|
PI | PI() | Возвращает значение π (3,1415). |
|
POWER | POWER(x, y) | Вычисляет значение x y . |
|
RAND | RAND() | Возвращает произвольное число типа FLOAT в диапазоне значений между 0 и 1. |
|
ROWCOUNT_BIG | ROWCOUNT_BIG() | Возвращает количество строк таблицы, которые были обработаны последней инструкцией Transact-SQL, исполненной системой. Возвращаемое значение имеет тип BIGINT. |
|
SIGN | SIGN(n) | Возвращает знак значения n в виде числа: +1, если положительное, -1, если отрицательное. |
|
SQRT, SQUARE | SQRT(n), SQUARE(n) | SQRT(n) - вычисляет квадратный корень числа n, SQUARE(n) - возвращает квадрат аргумента n. |
Функции даты
Функции даты вычисляют соответствующие части даты или времени выражения или возвращают значение временного интервала. Поддерживаемые в Transact-SQL функции даты и их краткое описание приводятся в таблице ниже:
Функция | Синтаксис | Описание | Пример использования |
---|---|---|---|
GETDATE | GETDATE() | Возвращает текущую системную дату и время. |
SELECT GETDATE() |
DATEPART | DATEPART (item, date) | Возвращает указанную в параметре item часть даты date в виде целого числа. |
Вернет 1 (Январь) SELECT DATEPART(month, "01.01.2012") -- Вернет 4 (Wednesday) SELECT DATEPART(weekday, "02.01.2012") |
DATENAME | DATENAME (item, date) | Возвращает указанную в параметре item часть даты date в виде строки символов. |
Вернет January SELECT DATENAME(month, "01.01.2012") -- Вернет Wednesday SELECT DATENAME(weekday, "02.01.2012") |
DATEDIFF | DATEDIFF (item, dat1, dat2) | Вычисляет разницу между двумя частями дат dat1 и dat2 и возвращает целочисленный результат в единицах, указанных в аргументе item. |
Вернет 19 (19 лет промежуток между датами) SELECT DATEDIFF(year, "01.01.1990", "01.01.2010") -- Вернет 7305 (7305 дней промежуток между датами) SELECT DATEDIFF(day, "01.01.1990", "01.01.2010") |
DATEADD | DATEADD (item, n, date) | Прибавляет n-е количество единиц, указанных в аргументе item к указанной дате date. (Значение аргумента n также может быть отрицательным.) |
Прибавит 3 дня к текущей дате SELECT DATEADD(day, 3, GETDATE()) |
Строковые функции
Строковые функции манипулируют значениями столбцов, которые обычно имеют символьный тип данных. Поддерживаемые в Transact-SQL строковые функции и их краткое описание приводятся в таблице ниже:
Функция | Синтаксис | Описание | Пример использования |
---|---|---|---|
ASCII, UNICODE | ASCII(char), UNICODE(char) | Преобразовывает указанный символ в соответствующее целое число кода ASCII. |
SELECT ASCII("W") -- 87 SELECT UNICODE("ю") -- 1102 |
CHAR, NCHAR | CHAR(int), NCHAR(int) | Преобразовывает код ASCII (или Unicode если NCHAR) в соответствующий символ. |
SELECT CHAR(87) -- "W" SELECT NCHAR(1102) -- "ю" |
CHARINDEX | CHARINDEX (str1, str2) | Возвращает начальную позицию вхождения подстроки str1 в строку str2. Если строка str2 не содержит подстроки str1, возвращается значение 0 |
Вернет 5 SELECT CHARINDEX ("морф", "полиморфизм") |
DIFFERENCE | DIFFERENCE (str1, str2) | Возвращает целое число от 0 до 4, которое является разницей между значениями SOUNDEX двух строк str1 и str2. Метод SOUNDEX возвращает число, которое характеризует звучание строки. С помощью этого метода можно определить подобно звучащие строки. Работает только для символов ASCII. |
Вернет 2 SELECT DIFFERENCE ("spelling", "telling") |
LEFT, RIGHT | LEFT (str, length), RIGHT (str, length) | Возвращает количество первых символов строки str, заданное параметром length для LEFT и последние length символов строки str для функции RIGHT. |
DECLARE @str nvarchar(30) = "Синхронизация"; -- Вернет "Синх" SELECT LEFT(@str, 4) -- Вернет "зация" SELECT RIGHT(@str, 5) |
LEN | LEN(str) | Возвращает количество символов (не количество байт) строки str, указанной в аргументе, включая конечные пробелы. |
|
LOWER, UPPER | LOWER(str), UPPER(str) | Функция LOWER преобразовывает все прописные буквы строки str1 в строчные. Входящие в строку строчные буквы и иные символы не затрагиваются. Функция UPPER преобразовывает все строчные буквы строки str в прописные. |
DECLARE @str nvarchar(30) = "Синхронизация"; -- Вернет "СИНХРОНИЗАЦИЯ" SELECT UPPER(@str) -- Вернет "синхронизация" SELECT LOWER(@str) |
LTRIM, RTRIM | LTRIM(str), RTRIM(str) | Функция LTRIM удаляет начальные пробелы в строке str, RTRIM соответственно удаляет пробелы в конце строки. |
|
QUOTENAME | QUOTENAME (char_string) | Возвращает строку в кодировке Unicode с добавленными ограничителями, чтобы преобразовать строку ввода в действительный идентификатор с ограничителями. |
DECLARE @str nvarchar(30) = "Синхронизация"; -- Вернет "[Синхронизация]" SELECT QUOTENAME(@str) |
PATINDEX | PATINDEX (%p%, expr) | Возвращает начальную позицию первого вхождения шаблона p в заданное выражение expr, или ноль, если данный шаблон не обнаружен. |
Вернет 4 SELECT PATINDEX("%хро%", "Синхронизация") |
REPLACE | REPLACE (str1, str2, str3) | Заменяет все вхождения подстроки str2 в строке str1 подстрокой str3. |
Вернет "Десинхронизация" SELECT REPLACE("Синхронизация", "Синхр", "Десинхр") |
REPLICATE | REPLICATE (str, i) | Повторяет i раз строку str. |
Вернет "aBaBaBaBaB" SELECT REPLICATE("aB", 5) |
REVERSE | REVERSE (str) | Выводит строку str в обратном порядке. |
Вернет "яицазинорхниС" SELECT REVERSE("Синхронизация") |
SOUNDEX | SOUNDEX (str) | Возвращает четырехсимвольный код soundex, используемый для определения похожести двух строк. Работает только для символов ASCII. |
|
SPACE | SPACE (length) | Возвращает строку пробелов длиной, указанной в параметре length. Аналог REPLICATE(" ", length). |
|
STR | STR (f[, len[, d]]) | Преобразовывает заданное выражение с плавающей точкой f в строку, где len - длина строки, включая десятичную точку, знак, цифры и пробелы (по умолчанию равно 10), а d - число разрядов дробной части, которые нужно возвратить. |
Вернет "3.14" SELECT STR (3.1415, 4, 2) |
STUFF | STUFF (str1, a, length, str2) | Удаляет из строки str1 length-символов, начиная с позиции a, и вставляет на их место строку str2. |
Note in a book SELECT STUFF("Notebook", 5, 0," in a ") -- Handbook SELECT STUFF("Notebook", 1, 4, "Hand") |
SUBSTRING | SUBSTRING (str1, a, length) | Извлекает из строки str, начиная с позиции a, подстроку длиной length. |
Системные функции
Системные функции языка Transact-SQL предоставляют обширную информацию об объектах базы данных. Большинство системных функций использует внутренний числовой идентификатор (ID), который присваивается каждому объекту базы данных при его создании. Посредством этого идентификатора система может однозначно идентифицировать каждый объект базы данных.
В следующей таблице приводятся некоторые из наиболее важных системных функций вместе с их кратким описанием:
Функция | Синтаксис | Описание | Пример использования |
---|---|---|---|
CAST | CAST (w AS type [(length)] | Преобразовывает выражение w в указанный тип данных type (если это возможно). Аргумент w может быть любым действительным выражением. |
Вернет 3 SELECT CAST (3.1258 AS INT) |
COALESCE | COALESCE (a1, a2) | Возвращает первое значение выражения из списка выражений a1, a2, ..., которое не является значением null. |
|
COL_LENGTH | COL_LENGTH (obj, col) | Возвращает длину столбца col объекта базы данных (таблицы или представления) obj. |
Вернет 4 SELECT COL_LENGTH ("Employee", "Id") |
CONVERT | CONVERT (type[(length)], w) | Эквивалент функции CAST, но аргументы указываются по-иному. Может применяться с любым типом данных. |
|
CURRENT_TIMESTAMP | CURRENT_TIMESTAMP | Возвращает текущие дату и время. |
|
CURRENT_USER | CURRENT_USER | Возвращает имя текущего пользователя. |
|
DATALENGTH | DATALENGTH (z) | Возвращает число байтов, которые занимает выражение z. |
Этот запрос возвращает длину каждого поля SELECT DATALENGTH(FirstName) FROM Employee |
GETANSINULL | GETANSINULL ("dbname") | Возвращает 1, если использование значений null в базе данных dbname отвечает требованиям стандарта ANSI SQL. |
|
ISNULL | ISNULL (expr, value) | Возвращает значение выражения expr, если оно не равно NULL; в противном случае возвращается значение value. |
|
ISNUMERIC | ISNUMERIC (expr) | Определяет, имеет ли выражение expr действительный числовой тип. |
|
NEWID | NEWID() | Создает однозначный идентификационный номер ID, состоящий из 16-байтовой двоичной строки, предназначенной для хранения значений типа данных UNIQUEIDENTIFIER. |
|
NEWSEQUENTIALID | NEWSEQUENTIALID() | Создает идентификатор GUID, больший, чем любой другой идентификатор GUID, созданный ранее этой функцией на указанном компьютере. (Эту функцию можно использовать только как значение по умолчанию для столбца.) |
|
NULLIF | NULLIF (expr1, expr2) | Возвращает значение null, если значения выражений expr1 и expr2 одинаковые. |
Запрос возвращает NULL для проекта, -- у которого Number = "p1" SELECT NULLIF(Number, "p1") FROM Project |
SERVERPROPERTY | SERVERPROPERTY (propertyname) | Возвращает информацию о свойствах сервера базы данных. |
|
SYSTEM_USER | SYSTEM_USER | Возвращает ID текущего пользователя. |
|
USER_ID | USER_ID () | Возвращает идентификатор пользователя username. Если пользователь не указан, то возвращается идентификатор текущего пользователя. |
|
USER_NAME | USER_NAME () | Возвращает имя пользователя с указанным идентификатором id. Если идентификатор не указан, то возвращается имя текущего пользователя. |
Функции метаданных
По большому счету, функции метаданных возвращают информацию об указанной базе данных и объектах базы данных. В таблице ниже приводятся некоторые из наиболее важных функций метаданных вместе с их кратким описанием:
Функция | Синтаксис | Описание | Пример использования |
---|---|---|---|
COL_NAME | COL_NAME (tab_id, col_id) | Возвращает имя столбца с указанным идентификатором col_id таблицы с идентификатором tab_id. |
Вернет имя столбца "LastName" SELECT COL_NAME (OBJECT_ID("Employee"), 3) |
COLUMNPROPERTY | COLUMNPROPERTY (id, col, property) | Возвращает информацию об указанном столбце. |
Вернет значение свойства PRECISION -- для столбца Id таблицы Employee SELECT COLUMNPROPERTY (OBJECT_ID("Employee"), "Id", "precision") |
DATABASEPROPERTY | DATABASEPROPERTY (database, property) | Возвращает значение свойства property базы данных database. |
Вернет значение свойства IsNullConcat -- для базы данных SampleDb SELECT DATABASEPROPERTY ("SampleDb", "IsNullConcat") |
DB_ID | DB_ID () | Возвращает идентификатор базы данных db_name. Если имя базы данных не указано, то возвращается идентификатор текущей базы данных. |
|
DB_NAME | DB_NAME () | Возвращает имя базы данных, имеющей идентификатор db_id. Если идентификатор не указан, то возвращается имя текущей базы данных. |
|
INDEX_COL | INDEX_COL (table, i, no) | Возвращает имя индексированного столбца таблицы table. Столбец указывается идентификатором индекса i и позицией no столбца в этом индексе. |
|
INDEXPROPERTY | INDEXPROPERTY (obj_id, index_name, property) | Возвращает свойства именованного индекса или статистики для указанного идентификационного номера таблицы, имя индекса или статистики, а также имя свойства. |
|
OBJECT_NAME | OBJECT_NAME (obj_id) | Возвращает имя объекта базы данных, имеющего идентификатор obj_id. |
SELECT OBJECT_NAME(245575913); |
OBJECT_ID | OBJECT_ID (obj_name) | Возвращает идентификатор объекта obj_name базы данных. |
Вернет 245575913 - ID таблицы Employee SELECT OBJECT_ID("Employee") |
OBJECTPROPERTY | OBJECTPROPERTY (obj_id, property) | Возвращает информацию об объектах из текущей базы данных. |
Строковые функции Sql
Эта группа функций позволяет манипулировать текстом. Строковых функций много, мы рассмотрим наиболее употребительные.- CONCAT(str1,str2...)
Возвращает строку, созданную путем объединения аргументов (аргументы указываются
в скобках - str1,str2...). Например, в нашей таблице Поставщики (vendors) есть столбец Город (city) и столбец Адрес (address).
Предположим, мы хотим, чтобы в результирующей таблице Адрес и Город указывались в одном столбце, т.е. мы хотим
объединить данные из двух столбцов в один. Для этого мы будем использовать строковую функцию CONCAT(), а в качестве
аргументов укажем названия объединяемых столбцов - city и address:
SELECT CONCAT(city, address) FROM vendors;
Обратите внимание, объединение произошло без разделения, что не очень читабельно. Давайте подправим наш запрос, чтобы между объединяемыми столбцами был пробел:
SELECT CONCAT(city, " ", address) FROM vendors;
Как видите, пробел считается тоже аргументом и указывается через запятую. Если объединяемых столбцов было бы больше, то указывать каждый раз пробелы было бы нерационально. В этом случае можно было бы использовать строковую функцию CONCAT_WS(разделитель, str1,str2...) , которая помещает разделитель между объединяемыми строками (разделитель указывается, как первый аргумент). Наш запрос тогда будет выглядеть так:
SELECT CONCAT_WS(" ", city, address) FROM vendors;
Результат внешне не изменился, но если бы мы объединяли 3 или 4 столбца, то код значительно бы сократился.
- INSERT(str, pos, len, new_str)
Возвращает строку str, в которой подстрока, начинающаяся
с позиции pos и имеющая длину len символов, заменена подстрокой new_str. Предположим, мы решили в столбце Адрес (address)
не отображать первые 3 символа (сокращения ул., пр., и т.д.), тогда мы заменим их на пробелы:
SELECT INSERT(address, 1, 3, " ") FROM vendors;
То есть три символа, начиная с первого, заменены тремя пробелами.
- LPAD(str, len, dop_str)
Возвращает строку str, дополненную слева строкой dop_str до длины len.
Предположим, мы хотим, чтобы при выводе городов поставщиков они располагались бы справа, а пустое пространство заполнялось бы
точками:
SELECT LPAD(city, 15, ".") FROM vendors;
- RPAD(str, len, dop_str)
Возвращает строку str, дополненную справа строкой dop_str до длины len.
Предположим, мы хотим, чтобы при выводе городов поставщиков они располагались бы слева, а пустое пространство заполнялось бы
точками:
SELECT RPAD(city, 15, ".") FROM vendors;
Обратите внимание, значение len ограничивает количество выводимых символов, т.е. если название города будет длиннее 15 символов, то оно будет обрезано.
- LTRIM(str)
Возвращает строку str, в которой удалены все начальные пробелы. Эта строковая
функция удобна для корректного отображения информации в случаях, когда при вводе данных допускаются случайные пробелы:
SELECT LTRIM(city) FROM vendors;
- RTRIM(str)
Возвращает строку str, в которой удалены все конечные пробелы:
SELECT RTRIM(city) FROM vendors;
В нашем случае лишних пробелов не было, поэтому и результат внешне мы не увидим.
- TRIM(str)
Возвращает строку str, в которой удалены все начальные и конечные пробелы:
SELECT TRIM(city) FROM vendors;
- LOWER(str)
Возвращает строку str, в которой все символы переведены в нижний регистр.
С русскими буквами работает некорректно, поэтому лучше не применять. Например, давайте
применим эту функцию к столбцу city:
SELECT city, LOWER(city) FROM vendors;
Видите, какая абракадабра получилась. А вот с латиницей все в порядке:SELECT LOWER("CITY");
- UPPER(str)
Возвращает строку str, в которой все символы переведены в верхний регистр.
С русскими буквами так же лучше не применять. А вот с латиницей все в порядке:
SELECT UPPER(email) FROM customers;
- LENGTH(str)
Возвращает длину строки str. Например, давайте узнаем сколько символов в наших
адресах поставщиков:
SELECT address, LENGTH(address) FROM vendors;
- LEFT(str, len)
Возвращает len левых символов строки str. Например, пусть в городах поставщиков
выводится только первые три символа:
SELECT name, LEFT(city, 3) FROM vendors;
- RIGHT(str, len)
Возвращает len правых символов строки str. Например, пусть в городах поставщиков
выводится только последние три символа:
SELECT LOAD_FILE("C:/proverka");
Обратите внимание, необходимо указывать абсолютный путь к файлу .
В этой части речь пойдет о функциях работы с текстовой информацией, которые могут применяться в запросах и программном коде на языке PL/SQL.
Функция CONCAT(strl, str2)
Данная функция выполняет конкатенацию строк strl и str2. Если один из аргументов равен NULL, то он воспринимается как пустая строка. Если оба аргумента равны NULL, то функция возвращает NULL. Пример:
SELECT CONCAT("У попа \ "была собака") x1,
CONCATCTest"
,
NULL)
х2,
CONCAT(NULL, "Test") х3,
CONCAT(NULL, NULL) x4
FROM
dual
У попа была собака |
Для конкатенации строк Oracle поддерживает специальный оператор конкатенации «||», который работает аналогично функции CONCAT, например:
SELECT CONCAT("У попа
\ "была собака")
x1, "У
попа " ||
"была собака" х2
FROM dual
Не следует путать оператор конкатенации «||», эквивалентный вызову функции CONCAT, и оператор «+», применяемый в арифметических операциях. В Oracle это разные операторы, но за счет автоматического приведения типов возможны трудноуловимые ошибки, например:
SELECT
"5"
+ "3" x1
FROM dual
В данном случае возвращается числовое значение 8, а не текстовая строка «53». Это связано с тем, что, обнаружив арифметическую операцию «+», Oracle автоматически пытается привести аргументы к типу NUMBER.
Функция LOWER(str)
Функция LOWER преобразует все символы строки str в строчные. Пример:
SELECT
LOWER("TeXt DATA") X
FROM dual
Функция UPPER(str)
Функция UPPER преобразует все символы строки str в прописные. Пример:
SELECT UPPER("TeXt DATA") X
FROM
dual
Функция INITCAP(str)
Возвращает строку str, в которой первые буквы всех слов преобразованы в прописные. Функция удобна для форматирования полного имени при построении отчетов. Пример:
SELECT INITCAPCИваноВ петр сиДорович")
X
FROM
dual
Функции LTRIM(str [,set]) и RTRIM(str [,set])
Функция LTRIM удаляет все символы с начала строки до первого символа, которого нет в наборе символов set. По умолчанию set состоит из одного пробела и может не указываться. Функция RTRIM аналогична LTRIM, но удаляет символы, начиная от конца строки. Рассмотрим несколько примеров:
SELECT LTRIM(" TeXt
DATA") X1,
LTRIM(" _ # TeXt
DATA", " #_") X2,
LTRIM(" 1234567890
TeXt DATA", "
1234567890") X3
FROM dual
Функция REPLACE(str, search_str, [,replace_str])
Функция REPLACE осуществляет поиск образца search_str в строке str и каждое найденное вхождение заменяет на replace_str. По умолчанию replace_str равен пустой строке, поэтому вызов функции REPLACE с двумя аргументами приводит к удалению всех найденных вхождений. Поиск подстроки ведется с учетом регистра. Пример:
SELECT REPLACE("У попа была собака",
"собака", "кошка")
x1,
REPLACE("У попа была злая собака",
"злая")
х2,
REPLACE("У попа была собака",
"Собака", "Кошка") х3
FROM dual
У попа была кошка |
У попа была собака |
У попа была собака |
Функция TRANSLATE(str, from_mask, to_mask)
Функция TRANSLATE анализирует строку str и заменяет в ней все символы, встречающиеся в строке from_mask, на соответствующие символы из to_mask. Для корректной работы функции строки from_mask и to_mask должны иметь одинаковую длину или строка from_mask должна быть длиннее, чем to_mask. Если from_mask длиннее, чем to_mask, и в процессе обработки строки str обнаружатся символы, соответствующие одному из символов from_mask, и при этом им не найдется соответствия в to_mask, то такие символы будут удалены из строки str. Если передать from_mask или to_mask, равное NULL, то функция возвратит значение NULL. Сравнение производится с учетом регистра.
SELECT TRANSLATE("Test 12345", "е2\
"Е!") x1,
TRANSLATE("Test 12345", "e234", "E") x2
FROM dual
Данная функция удобна для решения ряда практических задач, связанных с перекодировкой символов или с поиском запрещенных символов. Например, необходимо проанализировать пароль и выяснить, содержит ли он хотя бы одну цифру. Реализация данной проверки при помощи TRANSLATE имеет вид:
IF TRANSLATE(PassWd, "0123456789", "*") = PassWd THEN
ADD_ERR0R("Ошибка
- Пароль должен содержать хотя
бы одну цифру!");
RETURN 1;
END IF;
Другой пример: идет подготовка числа к его преобразованию в NUMBER. Необходимо заменить разделители десятичных знаков «,» и «.» на «.» и удалить пробелы. Реализация данной операции при помощи TRANSLATE имеет вид:
SELECT TRANSLATE("123 455,23", "., ", "
. . ")
x1,
TRANSLATE("-123
455.23", "., ", " . . ") х2
FROM dual
Функция SUBSTR(str, m [,n])
Функция SUBSTR возвращает фрагмент строки str, начиная с символа m длиной n символов. Длину можно не указывать - в этом случае возвращается строка от символа m и до конца строки str. Нумерация символов идет с 1. Если указать m = 0, то копирование все равно начнется с первого символа. Задание отрицательного значения m приводит к тому, что символы отсчитываются от конца строки, а не от начала. Задание значений m, превышающих по абсолютному значению длину строки, приводит к тому, что функция возвращает NULL.
SELECT SUBSTR("У
попа была собака", 13) x1,
SUBSTR("У попа была собака", -6) х2,
SUBSTR("Эto тестовый
текст", 5, 8) х3,
SUBSTR("У попа была собака", 150) х4
FROM dual
текстовый |
Функция INSTR(str, search_str [,n[,m]])
Функция INSTR возвращает позицию первого символа m-ro фрагмента строки str, совпадающего со строкой search_str. Сравнение ведется с n-го символа строки str, при сравнении учитывается регистр. По умолчанию n = m = 1, то есть поиск ведется от начала строки и возвращается позиция первого найденного фрагмента. В случае неуспешного поиска функция возвращает 0.
SELECT INSTR("y
попа была собака", "собака") x1,
INSTR("y
попа была собака", "кошка") х2,
INSTR("Это текст для демонстрации поиска текста", "текст",
1, 2) х3,
INSTR(‘11111000000001",
"1", 7) х4
FROM dual
С данной функций, равно как и со всеми остальными в Oracle, часто допускаются типовые ошибки, связанные с обработкой значения NULL. Если str=NULL, то функция вернет NULL, а не ноль! Это необходимо учитывать при построении различных условий. Например, данный фрагмент программы на PL/SQL как раз не учитывает эту особенность:
IF INSTR(TXT_VAR,
"*") = 0
THEN
...
END
IF
;
В данном случае правильно было бы написать так:
IF
NVL(INSTR(TXT_VAR,
"*"), 0) = 0 THEN
...
END
IF;
Функции LENGTH (str) и LENGTHB (str)
Функция LENGTH (str) возвращает длину строки str в символах. Для пустой строки и значения NULL функция возвращает NULL, поэтому совместно с данной функцией рекомендуется использовать NVL.
SELECT LENGTH("У попа
была собака")
x1,
LENGTH("") х2,
LENGTH(NULL)
х3,
NVL(LENGTH(""), 0) х4
FROM
dual
Функция LENGTHB аналогична функции LENGTH, но возвращает длину строки в байтах.
Функция ASCII(str)
Возвращает ASCII-код первого символа строки str в случае применения кодировки ASCII и значение первого байта многобайтного символа при использовании кодировки на основе многобайтных символов. Пример:
SELECT ASCII("Test") x1 FROM dual
Функция CHR(n)
Возвращает символ по его коду.
SELECT
CHR(64) x1
FROM dual