Tosterer
@Tosterer
Новичок

Почему запрос возвращает ошибку?

Запрос, который позволяет убрать из строки все нецифровые символы:
REPLACE( TRANSLATE(@Phone,
			REPLACE(TRANSLATE(@Phone, '0123456789', '##########'), '#', ''),
			REPLICATE('#', LEN(REPLACE(TRANSLATE(@Phone, '0123456789', '##########'), '#', '') + 'x') - 1)
				)
		, '#', '')

Разобрался в этом запросе пошагово, кроме одного момента: зачем в блоке REPLICATE к длине сначала прибавляется один символ (+'x'), а затем из нее вычитается один символ (-1)? На первый взгляд какая-то бессмысленная операция. Я убрал +'x' и -1, когда подставлял в этот запрос тестовые строки (пример: 'ghgf+1*2-3YYU', NULL, ''), и все работает без прибавления и последующего вычитания символа. Но в боевом запросе выдает сообщение:
The second and third arguments of the TRANSLATE built-in function must contain an equal number of characters.
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Используйте TRIM(Phone). Именно из-за конечных пробелов и делается " бессмысленная операция".
Для строк с Юникодом, которые не преобразуются в VARCHAR, нужно CAST(Phone AS VARCHAR).
Проверка
DECLARE @Table TABLE ( Phone NVARCHAR(50))
INSERT @Table VALUES
  ('ghgf+1*2-3YYU   '),
  (NULL),
  (''),
  (N'01©23Ӡ')
SELECT Phone, CAST(Phone AS VARCHAR), TRIM(CAST(Phone AS VARCHAR)),
       REPLACE ( 
         TRANSLATE( TRIM(CAST(Phone AS VARCHAR)), 
           REPLACE(
             TRANSLATE( TRIM(CAST(Phone AS VARCHAR)), '0123456789', '##########'), '#', ''), 
               REPLICATE( '#', LEN( 
                 REPLACE(
                   TRANSLATE( TRIM(CAST(Phone AS VARCHAR)), '0123456789', '##########'), '#', '')))), '#',  '')
  FROM @Table
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы