0

在 SQL 服务器中,我有 VARCHAR 值。

我需要一个自动重新格式化数据的视图。

以以下形式存储的数据:

hawthorn104freddy@hawthorn.com
scotland2samantha@gmail.com3
birmingham76roger@outlook.co.uk1905student

需要重新格式化为以下内容:

hawthorn  104freddy@hawthorn.com0000       
scotland  002samantha@gmail.com 0003       
birmingham076roger@outlook.co.uk1905student

重新格式化

  • 字符串中的数值用零填充到最长数字的长度
  • 所有其他字符都用空格字符填充以排列数字。

有谁知道这是怎么做到的?

注意:请记住,字符串可以包含单词和数字的任意组合。

4

2 回答 2

0

您应该将值拆分为 4 列(以查找每列中的最大长度),然后添加前导/尾随零/空格,然后将其连接起来。

这是拆分值的代码,希望您在添加零和空格时不会遇到问题:

declare  @v varchar(255) = 'hawthorg104freddy@hawthorn.com50'
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-to-search, - 替换和拆分 SQL 中的文本

于 2017-06-15T09:33:36.340 回答
0

您可以使用PATINDEX

declare @str varchar(100)='hawthorn104freddy@hawthorn.com'

SELECT SUBSTRING(@str,0,PATINDEX('%[0-9]%',@str)),
       SUBSTRING(@str,PATINDEX('%[0-9]%',@str),LEN(@str)-LEN(SUBSTRING(@str,0,PATINDEX('%[0-9]%',@str))))
于 2017-06-19T08:12:34.537 回答