SQL
Строковые функции
Строковые функции выполняют операции с строковыми значениями и возвращают либо числовые, либо строковые значения.
Используя строковые функции, вы можете, например, комбинировать данные, извлекать подстроку, сравнивать строки или преобразовывать строку ко всем строчным или строчным символам.
Синтаксис
- CONCAT (string_value1, string_value2 [, string_valueN])
- LTRIM (символьное выражение)
- RTRIM (character_expression)
- SUBSTRING (выражение, начало, длина)
- ASCII (символьное выражение)
- REPLICATE (string_expression, integer_expression)
- REVERSE (string_expression)
- ВЕРХНИЙ (символьное выражение)
- TRIM (строка [characters FROM])
- STRING_SPLIT (строка, разделитель)
- STUFF (character_expression, start, length, replaceWith_expression)
- REPLACE (string_expression, string_pattern, string_replacement)
замечания
Обрезать пустые пространства
Trim используется для удаления пространства записи в начале или в конце выбора
В MSSQL нет единого TRIM()
Объединить
В стандарте ANSI / ISO SQL оператор для конкатенации строк имеет значение || , Этот синтаксис поддерживается всеми основными базами данных, кроме SQL Server:
Многие базы данных поддерживают функцию CONCAT для объединения строк:
Некоторые базы данных поддерживают использование CONCAT для объединения более двух строк (Oracle не работает):
В некоторых базах данных должны быть отлиты или конвертированы нестроковые типы:
Некоторые базы данных (например, Oracle) выполняют неявные конверсии без потерь. Например, CONCAT на CLOB и NCLOB дает NCLOB . CONCAT на число и varchar2 приводит к varchar2 и т. Д .:
Некоторые базы данных могут использовать нестандартный + оператор (но в большинстве + работает только для чисел):
В SQL Server <2012, где CONCAT не поддерживается, + — единственный способ присоединиться к строкам.
Верхний и нижний регистр
Substring
Синтаксис: SUBSTRING ( string_expression, start, length ) . Обратите внимание, что строки SQL являются 1-индексированными.
Это часто используется в сочетании с функцией LEN() чтобы получить последние n символов строки неизвестной длины.
Трещина
Разделяет строковое выражение с помощью разделителя символов. Обратите внимание, что STRING_SPLIT() является табличной функцией.
дрянь
Поместите строку в другую, заменив 0 или более символов в определенной позиции.
Примечание: start позиция 1-индексация (вы начинаете индексирование с 1, а не 0).
длина
SQL Server
LEN не считает конечное пространство.
DATALENGTH подсчитывает конечное пространство.
Следует отметить, однако, что DATALENGTH возвращает длину базового байтового представления строки, которая зависит, ia, от кодировки, используемой для хранения строки.
оракул
Синтаксис: Length (char)
См. Также: LengthB, LengthC, Length2, Length4
замещать
REPLACE( String для поиска , String для поиска и замены , String для размещения в исходной строке )
ЛЕВО ПРАВО
Синтаксис:
LEFT (строковое выражение, целое число)
RIGHT (строковое выражение, целое число)
Oracle SQL не имеет функций LEFT и RIGHT. Их можно эмулировать с помощью SUBSTR и LENGTH.
SUBSTR (строковое выражение, 1, целое число)
SUBSTR (string-expression, length (string-expression) -integer + 1, integer)
ЗАДНИЙ ХОД
Синтаксис: REVERSE (строковое выражение)
REPLICATE
Функция REPLICATE объединяет строку с самим собой определенное количество раз.
Синтаксис: REPLICATE (string-expression, integer)
REGEXP
Проверяет, соответствует ли строка регулярному выражению (определенному другой строкой).
Заменить функцию в SQL-запросе Select and Update
Функция Replace в SQL используется для обновления содержимого строки. Вызов функции REPLACE () для MySQL, Oracle и SQL Server.
Синтаксис функции Replace:
Следующий пример заменяет появление таблицы South with Southern in Employees:
| Имя | Адрес |
|---|---|
| Джеймс | Южный Нью-Йорк |
| Джон | Южный Бостон |
| Майкл | Южный Сан-Диего |
Выберите Заявление:
Если мы применим следующую функцию Replace:
| Имя | Адрес |
|---|---|
| Джеймс | Южный Нью-Йорк |
| Джон | Южный Бостон |
| Майкл | Южный Сан-Диего |
Заявление о обновлении:
Мы можем использовать функцию замены для внесения постоянных изменений в нашу таблицу с помощью следующего подхода.
Более общий подход заключается в использовании этого в сочетании с предложением WHERE следующим образом:
ParseName
БАЗЫ ДАННЫХ : SQL Server
Функция PARSENAME возвращает определенную часть заданной строки (имя объекта). имя объекта может содержать строку, такую как имя объекта, имя владельца, имя базы данных и имя сервера.
Синтаксис
пример
Чтобы получить имя объекта, используйте индекс детали 1
Чтобы получить имя схемы, используйте параметр part 2
Чтобы получить имя базы данных, используйте индекс детали 3
Чтобы получить имя сервера, используйте индекс детали 4
PARSENAME возвращает null указанная часть отсутствует в заданной строке имени объекта
Обрезка строки в sql

В MySQL, например, есть две функции, которые могут помочь:
— INSTR — возвращает первую позицию подстроки в строке.
— LEFT — обрезает текст с начала до указанной позиции.
Поэтому можно сделать так (-1 нужен, чтобы в результат не включать пробел):
Но, если в строке нет пробелов, то вернется строка с нулевой длиной. Для этого можно добавить условие, и если нет пробелов в строке — возвращать исходную строку.
2.25. Функции работы со строками
У SQL сервера достаточно много мощных функций для работы со строками и в этом разделе мы рассмотрим наиболее интересные и часто используемые из них. Из моего личного опыта (ваши задачи могут дать другой результат), наиболее часто используемой является функция SUBSTRING. Именно с нее мы и начнем.
SUBSTRING
Помниться, что мы добавили к значениям в колонке имен работников префикс ‘mr.’ (см. разд. 2.17). А как теперь от него избавится во время обращения к таблице? Достаточно просто, если воспользоваться функцией SUBSTRING, которая возвращает указанную часть строки. Этой функции необходимо передать три параметра:
- Поле, часть строки которого нужно получить;
- Первый символ;
- Количество интересующих нас символов.
Посмотрим, как вышесказанное можно реализовать в виде запроса:
В этом примере, мы выбираем только два поля: «idPeoples» и поле, результат которого зависит от проверки CASE. В данном случае CASE проверяет результат работы функции SUBSTRING, которая выбирает символы из поля «vcFamil» начиная с первого по третий. Если результат равен ‘mr.’, то необходимо обрезать этот префикс.
Для того, чтобы отбросить ненужные символы от значения поля, мы снова пользуемся функцией SUBSTRING, но теперь выбираем символы, начиная с четвертного (начиная с первого, после ‘mr.’). В качестве количества символов я указал число 255, что больше максимального значения поля, а значит, строка будет выбрана до конца, начиная 4-го.
Теперь попробуем обновить данные в таблице, чтобы в поле «vcName», чтобы в нем не было лишних символов ‘mr.’. Для этого выполняем следующий запрос:
В этом примере полю «vcName»присваивается результат сравнения CASE, который мы уже рассмотрели выше. Таким образом, мы избавились от лишних букв в фамилиях.
Задачу обрезание лишних символов из начала строки можно было бы решить и с использованием функции LEFT, которая возвращает указанное количество символов, начиная с 1-го. Функции нужно передать следующие два параметра:
- Поле, подстроку которого нужно получить;
- Количество символов.
Следующий пример формирует ФИО, в котором имя и отчество сокращены:
Поле «vcFamil» выводится полностью, а вот от имени и отчества выводится только один левый (первый) символ.
Теперь посмотрим, как можно было использовать LEFT для обрезания префикса ‘mr.’:
Функция LEN позволяет определить длину строки или значения поля. Функции достаточно передать строку или имя поля, длина значений которого нас интересует. Например, следующий запрос отобразить длину всех значений в поле «vcFamil»:
В следующем примере мы ищем записи, в которых фамилия состоит 7-и символов:
LOWER
Если ваш сервер настроен так, что строки чувствительные к регистру букв, то с поиском по строковым полям могут быть серьезные проблемы. Если вы указали фамилию как Иванов, то это значение не будет равно ИВАНОВ, а значит, мы не увидим необходимую запись. Проблему решает функция LOWER, которая приводит указанную строку к нижнему регистру.
Рассмотрим пример. В следующем запросе мы выбираем все фамилии, при этом они отображаются в нижнем регистре (маленькими буквами):
Теперь посмотрим на следующий пример:
В секции WHERE, где мы сравниваем значение поля с введенной пользователем фамилией, и то и другое приводится к нижнему регистру. Таким образом, как бы не хранилась фамилия в базе, все Ивановы будут найдены.
UPPER
Функция Upper также изменяет регистр букв, только делает их все большими. Это значит, что функцию можно также использовать для сравнения двух строк разного регистра, если все буквы привести к большим:
Если вам нужно сравнить две строки не обращая внимания на используемых регистр букв внутри строк, можно использовать как UPPER, так и LOWER. Разницы никакой нет, поэтому выбирайте то, что больше нравится.
LTRIM и RTRIM
Функция LTRIM убирает все символы пробела в начале строки, а RTRIM убирает пробелы в конце строки. Допустим, что пользователь при вводе фамилии в самом начале случайно зацепил клавишу пробела. Получилось, что в базе хранится две фамилии:
Когда смотришь на эти фамилии, то видно, что вторая строка сдвинута вправо за счет пробела вначале. Это значит, что база данных будет воспринимать эти значения по-разному. Чтобы избавится от лишних пробелов, как раз используют функции LTRIM и RTRIM. Например:
В этом примере поле «vcFamil» сравнивается с фамилией Сидоров, с пробелом в начале. Чтобы убрать пробел используется функция LTRIM. В следующем примере мы убираем и левые и правые пробелы:
Если честно, то пробелы справа убираются сервером автоматически. Выполните следующий запрос и убедитесь сами:
Если работник с фамилией Сидоров (без пробелов в конце) существует в таблице, и запрос отобразил его, то сервер автоматически убрал пробел.
PATINDEX
С помощью функции PATINDEX можно искать часть подстроки по определенному шаблону. Допустим, что нам надо найти все фамилии, в которых есть две буквы «о», между которыми может находиться любой символ. Эту задачу можно решить с помощью следующего запроса:
Если посмотреть на функцию, то пока не понятно, чем она отличается от LIKE с шаблоном? Все очень просто – LIKE используется для создания ограничений в секции WHERE, а PATINDEX возвращает индекс символа, начиная с которого идет указанный шаблон в строке. Если бы мы использовали LIKE, то сервер вернул бы нам только те строки, где найден шаблон:
Если использовать функцию PATINDEX, то в результат попадут все строки (мы не ограничиваем вывод в секции WHERE), но там где в фамилии нет шаблона, в соответствующей строке будет стоять ноль, а там где есть, будет стоять 1. Посмотрим на пример результата выполнения запроса с использованием функции PATINDEX:
В данном примере шаблон ‘%О_О%’ присутствует в фамилии Сидоров. Начиная с четвертого символа идут буквы «оро».
REPLACE
Функция replace позволяет найти в значении поля подстроку и заменить ее на новое значение. У этой функции три параметра:
- Строка, в которой нужно искать подстроку;
- Подстрока, которую ищем;
- Значение, которое нужно подставить.
Посмотрим пример использования этой функции:
Мы выбираем из таблицы два поля: фамилию и результат функции REPLACE. Функция ищет в поле «vcFamil» строку «оро» и заменяет ее на строку «аро». Чтобы лучше было понятно, посмотрим на результат работы функции:
В первой колонке показана фамилия из таблицы, а во второй колонке можно увидеть модифицированный с помощью функции REPLACE вариант. Я думаю, что все понятно и без лишних комментариев.
REPLICATE
С помощью функции REPLICATE можно размножать строку. У функции два параметра:
- Строка или имя поля, которое нужно вывести несколько раз;
- Количество необходимых повторений
Переходим к примеру. Следующий запрос выводит в результирующий набор дважды значение поля фамилии:
В результате мы увидим нечто подобное:
В данном примере мало полезного смысла, но функция не совсем бесполезна. Например, вы хотите нарисовать длинную двойную полоску. Можно нажать клавишу равенства и ждать, когда появится на экране полоска нужной длины, а можно просто клонировать знак равенства нужное количество раз. Следующий пример клонирует знак 50 раз:
Красиво? А главное удобно в управлении.
REVERSE
Пару раз я встречался с необходимостью перевернуть строку задом наперед, и в этом мне помогла функция REVERSE. Ей нужно передать строку и результатом будет та же строка, только буквы будут идти в обратном порядке. Например, следующий запрос выводит все фамилии задом наперед:
В реальных приложениях полностью строку вы будете менять достаточно редко, а вот часть строки может меняться. Например, в следующем запросе в фамилии меняются местами первые два символа:
Пример достаточно интересен тем, что лишний раз показывает, как использовать уже известные нам функции работы со строками. В результирующем наборе отображается результат работы функции REPLACE. Функции нужно передать:
- Название поля, где хранится фамилия;
- Первые два символа. Для получения первых двух символов используем уже знакомую нам функцию LEFT;
- В качестве строки, которая должна будет поставлена вместо первых двух символов фамилии, выступают те же два символа, только перевернутые.
SPACE
С помощью функции SPACE можно создавать пробелы. В качестве единственного параметра нужно указать число, которое определяет количество возвращаемых пробелов. Работа функции идентична REPLICATE, если в качестве клонируемого символа указать пробел.
Допустим, что нам нужно вывести на экран поля фамилию и имя, разделенные 5-ю пробелами. Можно сделать так:
А можно воспользоваться функцией SPACE:
Зачем нужна функция, когда можно воспользоваться без нее? Допустим, что вам нужно использовать 5 пробелов в нескольких местах большого сценария. Все легко решается без функций, но в последствии оказалось, что количество пробелов должно быть не 5, а 10. Придется пересматривать весь сценарий и корректировать пробелы. А если бы мы использовали SPACE в сочетании с переменными, то проблема решилась бы намного проще.
Рассмотрим пример, в котором множественные пробелы используются дважды и для задания количества используется переменная:
Теперь, достаточно только изменить значение переменной, и количество пробелов изменено во всем сценарии. А главное – что количество пробелов может быть определено динамически, на основе запросов к таблице.
С помощью функции STR можно форматировать дробные числа в строку. Чем это отличается от преобразования типов? Тип остается тем же, а на экран мы выводим строку в нужном виде. Функции нужно передать три параметра:
- Дробное число, которое нужно форматировать;
- Общее количество символов, включая числа до и после запятой, пробелы и знак;
- Количество знаков после запятой.
Допустим, что нам нужно вывести название и цену товара. Но цена имеет тип money, который содержит слишком большое количество нулей. Чтобы избавиться от лишних чисел после запятой и получить строку, можно сначала привести тип money к типу number(10, 2), а потом результат привести к строке. Но можно решить все одной командой форматирования STR:
Выполните этот запрос и обратите внимание, что второе поле (отформатированная цена) выровнена вправо:
Выравнивание происходит из-за второго параметра – числа 10. Мы задали общее число символов, и выравнивание будет происходить по правой позиции указанного значения. Если второй параметр равен 10, а число состоит из 4 символов, то в начало результирующей строки будет добавлено 6 пробелов. Учитывайте это, при использовании функции STR.
STUFF
Функция STUFF позволяет вставить строку в определенную позицию другой строки. У этой функции четыре параметра:
- Строка, которую нужно изменить;
- Позиция, в которую должна произойти вставка;
- Количество удаляемых символов;
- Вставляемая строка.
Длина вставляемой строки не обязательно должна быть равна значению из 3-го параметра. Во время выполнения, функция сначала удаляет определенное количество символов, начиная с позиции из второго параметра, а затем вставляет новую строку.
Рассмотрим пример, в котором цена вставляется в поле названия товара, начиная с первой позиции, не удаляя ни одного из символов:
Результат работы функции будет следующим:
На этом примере более наглядно видно, что вставляемая цена выравнивается вправо. Так как мы указали в функции STR количество символов равное 10, то вставляется не реальный размер цены, а именно 10 символов.
Попробуйте увеличить третий параметр до 1. В этом случае, первый символ в названии товара будет удален, а вместо него будет вставлена цена.
SQL Server функция SUBSTRING
В SQL Server (Transact-SQL) функция SUBSTRING позволяют извлекать подстроку из строки.
Синтаксис
Синтаксис функции SUBSTRING в SQL Server (Transact-SQL):
Параметры или аргументы
string — исходная строка для извлечения.
start_position — позиция начала извлечения. Первая позиция в строке всегда 1.
length – количество извлекаемых символов.
Примечание
Если длина — отрицательное число, то функция SUBSTRING вернет ошибку.
Применение
Функция SUBSTRING может использоваться в следующих версиях SQL Server (Transact-SQL):
SQL Server vNext, SQL Server 2016, SQL Server 2015, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005
Пример
Рассмотрим некоторые примеры SQL Server функции SUBSTRING, чтобы понять, как использовать функцию SUBSTRING в SQL Server (Transact-SQL). Например: