Функции REPLICATE и STUFF

Для удвоения числа искомых символов здесь применялась конкатенация — @str+@str. Однако для этой цели можно использовать еще одну функцию — REPLICATE, которая повторяет первый аргумент такое число раз, которое задается вторым аргументом.

SELECT name, 
      (LEN(REPLACE(name, @str, REPLICATE(@str, 2)))  LEN(name))/LEN(@str)
FROM Ships;

То есть мы повторяем дважды подстроку, хранящуюся в переменной @str.

Если же нужно заменить в строке не определенную последовательность символов, а заданное число символов, начиная с некоторой позиции, то проще выбрать функцию STUFF:

STUFF(<строка1>, <стартовая позиция>, L , <строка2>)

Эта функция заменяет подстроку длиной L, которая начинается со стартовой позиции в строке1 на строку2.

Пример 7.2.1

Изменить имя корабля: оставив в его имени 5 первых символов, дописать «_» (нижнее подчеркивание) и год спуска на воду. Если в имени менее 5 символов, дополнить его пробелами.

Можно решать эту задачу с помощью разных функций. Мы же попытаемся это сделать с помощью функции STUFF.

В первом приближении напишем (ограничимся запросом на выборку):

SELECT name, STUFF(name, 6, LEN(name), '_'+launched)
FROM Ships;
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

В качестве третьего аргумента (количества символов для замены) мы используем LEN(name), так как нам нужно заменить все символы до конца строки, поэтому мы берем с запасом — исходное число символов в имени. И все же этот запрос вернет ошибку. Причем дело не в третьем аргументе, а в четвертом, где выполняется конкатенация строковой константы и числового столбца. Ошибка приведения типа. Для преобразования числа к его строковому представлению можно воспользоваться еще одной встроенной функцией — STR.

Параметр L функции STUFF целочисленный; это значит, что он может принимать отрицательные значения и 0. Для отрицательных значений функция STUFF вернет NULL, как и для случая, когда второй параметр превышает длину строки1. Нуль же означает вставку строки2 в строку1, начиная с позиции, заданной вторым параметром.

Пример 7.2.2

Добавить разделитель “-” в строковое представление даты в формате YYYYMMDD
SELECT STUFF(STUFF('20121119',5,0,'-'),8,0,'-');
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]