Skip to content

Пример применения функции Substring в T-SQL, R и Python

Пересказ статьи Siddharth Mehta. SQL Server Substring Function Example with T-SQL, R and Python



Проблема


Манипуляция со строками является одним из наиболее фундаментальных элементов работы с данными, используемом почти в каждом примере преобразования данных. Основными целями манипуляции со строками являются форматирование, усечение, набивка, замена и аналогичные функции. Часто для применения этих функций требуется выбрать конкретную часть строки, и затем применить преобразования. В SQL Server имеется три языка, которые часто используются в связке - T-SQL, R и Python. Все эти языки программирования/запросов предоставляют возможность выбора подстроки с помощью функции substring или эквивалентной функции/оператора. Здесь мы научимся использовать функцию substring для выбора строки на всех трех языках.

Решение


Функция substring в T-SQL (SQL Server)


Начнем с функции substring в языке T-SQL. Функция имеет следующий синтаксис:
SUBSTRING (expression, start, length)  			

Здесь expression означает фактическую строку, имя поля или переменную символьного типа данных. Параметр start - начальная позиция, а length - длина извлекаемой части строки.

На приведенных ниже примерах первый извлекает часть, которая начинается с позиции 1 длиной 5 символов от начальной позиции индекса. Т.е. первым символом в строке "hello world" является "h", а пять символов от "h" заканчиваются на "o". В результате получим "hello". Второй пример начинает выделение с позиции -2 длиной 5 символов, что эквивалентно стартовой позиции 1 с длиной 3, что в результате дает "he", как показано ниже.



Выполним теперь несколько примеров с функцией substring в предложении WHERE запроса SELECT. Мы можем использовать вывод из sys.tables (на рисунке ниже). Пусть нам требуется выбрать все таблицы, имена которых содержат слово "Pro".



Мы можем использовать функцию substring как часть критерия для фильтрации. В этой функции роль expression играет поле "name", начальная позиция 1, а длина 3, поскольку мы знаем, что слово "Pro" имеет длину 3 символа. Критерием в предложении WHERE должно быть логическое выражение, поэтому мы будем искать соответствие значения функции substring со словом "Pro". Выполнение нижеприведенного запроса даст на выходе имена таблиц, которые начинаются со слова "Pro".



Результат выше не вполне верный, поскольку мы получили только имена таблиц, которые начинаются с "Pro", но слово "Pro" может также находиться в середине или в конце строки. Это приводит нас к ситуации, когда требуется найти начальную позицию слова "Pro" динамически. Для этого мы можем использовать функцию charindex. Эта функция первым аргументом имеет поисковую строку, вторым - поле/переменную/значение, в котором выполняется поиск строки. Третий аргумент - начальная позиция поиска - является необязательным. Модифицируем запрос SELECT, как показано ниже, и теперь мы получим все имена таблиц, содержащих слово "Pro".



Функция substring в R


Давайте теперь разберемся с тем, как substring работает в языке программирования R. R предоставляет функции substring и substr, которые имеют эквивалентную функциональность функции substring в T-SQL. Вы можете выполнить код R в T-SQL, используя хранимую процедуру sp_execute_external_script.

Ниже первый пример демонстрирует применение функции substr, которая работает в точности как функция substring в T-SQL. Вы можете также использовать функцию substring, которая принимает строку, начальную и конечную позиции в качестве аргументов. Вы можете использовать диапазоны для параметра начальной и конечной позиций.

Во втором примере мы задаем диапазон 1 - 5 для начальной позиции, как и для конечной позиции; результат приведен ниже. Вы могли бы получить каждую букву на выходе для первых пяти символов строки, т.к. параметры трактуются так: начало 1 и конец 1, начало 2 и конец 2, и т.д. Поэтому длина на выходе всегда 1 символ.

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



Функция substring в Python


Строка в python рассматривается как массив символов Юникод. Python не имеет эквивалента для типа данных символов, т.к. строки рассматриваются просто как массивы. Доступ к массивам в Python осуществляется с помощью номера позиции в квадратных скобках. Поэтому давайте разберемся, как выполняются операции с массивами строковых литералов.

В первой строке кода мы создаем строковый литерал присвоением ему строкового значения. В следующей строке кода мы получаем второй символ строкового литерала, обращаясь к элементу массива на позиции 1 (индексация начинается с 0). Если мы используем отрицательное значение, например, -4, то это будет стартовой позицией выборки с правой стороны строки. Если вы посмотрите на результат выполнения третьей строки кода, то поймете, как работают отрицательные позиции.

Допустим мы хотим получить строку, указывая стартовую и конечную позиции. В этом случае мы можем задать диапазон в качестве элемента массива. В четвертой строке кода мы задаем диапазон от 1 до -4, что означает, что выбор начинается с первого элемента и заканчивается четвертым элементом с конца (заметим, что в Python правая граница не входит в диапазон).

Давайте рассмотрим еще один пример, когда нам требуется извлечь каждый третий символ строки. Вы можете использовать оператор двойного двоеточия в массиве и указать интервалы, как показано в последней строке кода (3 в нашем случае). На выходе будет строка, состоящая из каждого третьего символа исходной строки.



Таким образом, вы можете выполнять операции выборки подстроки на разных языках с помощью функции substring или ее эквивалента. Сравнивая производительность функциональности substring в разных языках, вы можете выбрать тот язык, который даст наилучшую производительность на больших объемах данных.

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.