У меня есть следующий код, который я пытаюсь реорганизовать для форматирования поля номера телефона в том формате, в котором он мне нужен:
STUFF(STUFF(STUFF(REPLACE('02 212345678','02 2','02 '), 7, 0, ' '), 3, 0, ') '), 1, 0, '(')
В настоящее время он возвращает данные следующим образом:
(02) 123 45678
где мне это нужно в этом формате
(02) 1234 5678
Проблема заключается в лишнем пространстве после закрывающей скобки и наличии 4 чисел с каждой стороны.
Спасибо, Стью, готово.





Основываясь на вашем примере, работает ли для вас следующее?
with sampledata as (select '02 212345678' num)
select Concat(Stuff('() ',2,0,Left(num,2)), Stuff(Right(num,8),5,0,' '))
from sampledata
Ура, приятель, работает как мечта.
Первый STUFF() вроде бы не нужен. Можно сократить, просто используя CONCAT() для добавления круглых скобок SELECT Concat('(',Left(num,2),') ',Stuff(Right(num,8),5,0,' '))
Ваш существующий код работает, просто нужно изменить 7 на 8, но я предпочитаю разделять форматирование и данные. Код waaaaaay легче читать и изменять:
DECLARE @PhoneNumber varchar(20) = '02 212345678';
SELECT FORMATMESSAGE('(%s) %s %s', LEFT(@PhoneNumber, 2), SUBSTRING(@PhoneNumber, 4, 4), SUBSTRING(@PhoneNumber, 8, 4) );
Хотя это нормально для специального или минимального использования строк, помните, что формат сообщения неэффективен, и его следует избегать для больших наборов строк, я тестировал его раньше и обнаружил, что он работает до 20 раз медленнее.
Специальные запросы для разработки специальной схемы. Подобное форматирование, независимо от того, используете ли вы STUFF, CONCAT, FORMATMESSAGE, xp_sprintf, — плохая идея для клиентских запросов. Плохо отформатированные данные = неэффективные запросы к базе данных. Если номер телефона состоит из отдельных частей, с которыми вам нужно работать по отдельности, их следует хранить в отдельных столбцах. Проверяйте и форматируйте свои данные, прежде чем сохранять их в своей базе данных, в противном случае затраты на выполнение этой проверки и форматирования должны будут выполняться для каждой строки в каждом запросе навсегда.
Непонятно, как вы собираетесь разбить строку, используйте разные цифры вместо всех 9, чтобы было понятно.