【问题标题】:SQL server string or VARCHAR manipulation containing numerics包含数字的 SQL 服务器字符串或 VARCHAR 操作
【发布时间】:2017-06-15 07:56:52
【问题描述】:

在 SQL Server 中,我有 VARCHAR 值。

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

以下列形式存储的数据:

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

需要重新格式化成如下:

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

重新格式化

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

有人知道这是怎么做到的吗?

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

【问题讨论】:

  • 祝你好运,用正则表达式和字符串函数在纯 SQL 中实现这一点。在存储过程中实现算法可能是您在数据库端执行此操作的唯一方法,但我宁愿使用真正的编程语言对其进行编码。
  • 也许不是最好的报价,但我建议您检查一下您在数据库中存储数据的内容和方式。

标签: sql-server varchar reformatting


【解决方案1】:

您应该将值拆分为 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,-replace-and-split-text-in-SQL

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多