Строка SQL-сервера или манипуляция VARCHAR, содержащая числовые значения

На сервере SQL у меня есть значения VARCHAR.

Мне нужно представление, которое автоматически переформатирует данные.

Данные, которые хранятся в следующем виде:

[email protected]
[email protected]
[email protected]

Необходимо переформатировать в следующее:

hawthorn  [email protected]       
scotland  [email protected] 0003       
[email protected]

Переформатирование

  • Числовые значения в строках дополняются нулями до длины самого длинного числа.
  • Все остальные символы дополняются пробелами для выравнивания чисел.

Кто-нибудь знает, как это делается?

Примечание. Имейте в виду, что строка может содержать любую комбинацию слов и цифр.


person WonderWorker    schedule 15.06.2017    source источник
comment
Удачи в достижении этого в чистом SQL с RegExps и строковыми функциями. Реализация алгоритма в хранимой процедуре, вероятно, является вашим единственным способом сделать это на стороне базы данных, но я бы предпочел кодировать его с помощью реального языка программирования.   -  person Thomas G    schedule 15.06.2017
comment
Может быть, не самое лучшее предложение, но я бы посоветовал проверить, что и как вы храните данные в своей базе данных.   -  person Evaldas Buinauskas    schedule 19.06.2017


Ответы (2)


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

Вот код для разделения значений, надеюсь, у вас не возникнет проблем с добавлением нулей и пробелов:

declare  @v varchar(255) = '[email protected]'
select 
    FirstPart   = left(@v, patindex('%[a-z][0-9]%', @v)), 
    SecondPart  = substring(@v, patindex('%[0-9]%', @v), patindex('%[0-9][a-z]%', @v) - patindex('%[a-z][0-9]%', @v)), 
    ThirdPart   = substring(@v, patindex('%[0-9][a-z]%', @v) + 1, len(@v) - patindex('%[0-9][a-z]%', @v) - patindex('%[0-9][a-z]%', reverse(@v))), 
    Fourthpart  = right(@v, patindex('%[0-9][a-z]%', reverse(@v)))

Примечания:

patindex('%[a-z][0-9]%', @v) - Последняя буква боярышника (никнейм?)

patindex('%[0-9][a-z]%', @v) - Последняя цифра в первом номере (104)

patindex('%[0-9][a-z]%', reverse(@v)) - Длина последнего числа

Вы также можете использовать CLR и RegEx для разделения значений на группы: https://github.com/zzzprojects/Eval-SQL.NET/wiki/SQL-Server-Regex-%7C-Use-regular-expression-дляпоиска,заменыиразделениятекставSQL

person Mikhail Lobanov    schedule 15.06.2017

Вы можете использовать PATINDEX.

declare @str varchar(100)='[email protected]'

SELECT SUBSTRING(@str,0,PATINDEX('%[0-9]%',@str)),
       SUBSTRING(@str,PATINDEX('%[0-9]%',@str),LEN(@str)-LEN(SUBSTRING(@str,0,PATINDEX('%[0-9]%',@str))))
person huMpty duMpty    schedule 19.06.2017