2017-06-15 64 views
0

在SQL服务器中,我有VARCHAR值。SQL服务器字符串或包含数字的VARCHAR操作

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

数据存储在以下形式:

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

需要重新格式化成如下:

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

重新格式化

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

有谁知道这是怎么完成的?

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

+0

好运气在与正则表达式和字符串函数纯SQL来实现这一目标。在存储过程中实现算法可能是您在数据库端执行该操作的唯一方法,但我宁愿使用真正的编程语言对其进行编码。 –

+0

也许不是最好的报价,但我建议您查看您在数据库中存储数据的方式和方式。 –

回答

0

你应该将你的值分成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和正则表达式的值拆分组: https://github.com/zzzprojects/Eval-SQL.NET/wiki/SQL-Server-Regex-%7C-Use-regular-expression-to-search,-replace-and-split-text-in-SQL

0

您可以使用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))))