Функции 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
Можно решать эту задачу с помощью разных функций. Мы же попытаемся это сделать с помощью функции STUFF.
В первом приближении напишем (ограничимся запросом на выборку):
SELECT name, STUFF(name, 6, LEN(name), '_'+launched)
FROM Ships;
[[ column ]] |
---|
NULL [[ value ]] |
В качестве третьего аргумента (количества символов для замены) мы используем LEN(name), так как нам нужно заменить все символы до конца строки, поэтому мы берем с запасом — исходное число символов в имени. И все же этот запрос вернет ошибку. Причем дело не в третьем аргументе, а в четвертом, где выполняется конкатенация строковой константы и числового столбца. Ошибка приведения типа. Для преобразования числа к его строковому представлению можно воспользоваться еще одной встроенной функцией — STR.
Параметр L функции STUFF целочисленный; это значит, что он может принимать отрицательные значения и 0. Для отрицательных значений функция STUFF вернет NULL, как и для случая, когда второй параметр превышает длину строки1. Нуль же означает вставку строки2 в строку1, начиная с позиции, заданной вторым параметром.
Пример 7.2.2
SELECT STUFF(STUFF('20121119',5,0,'-'),8,0,'-');
[[ column ]] |
---|
NULL [[ value ]] |